推广一波我写的 Mongoose 插件,可以让我们直接搜索 ref:'xxx' 的属性

2022-02-10 00:20:01 +08:00
 Cheez

相信不少使用 Mongoose 的朋友都遇到过,想要在对参考字段的值进行搜索。

参考字段,也就是类似这样的字段:

{
    type: MongooseSchema.Types.ObjectId,
    ref: 'XXX',
  }

例如我们有 Cat 这个 Model ,它有 sex (性别)、parents (父母)和 owner (主人)三个属性,ref 分别是 'Cat' 和 'Person'; Person 则有 name (名字)一个属性。

然后我们想要查询性别为女、父母的主人名字是 'Dean' 的猫,我们可能会这么写:

const result = await catModel
  .find({
    $and: {
      parents: {
        'owner.name': 'Dean',
      },
      sex: 0,
    },
  })
  .exec();

但我们知道,这样只会报错。因为 parents 此刻是 ObjectId ,populate 是 Mongoose 的功能,不是 MongoDB 的。

假设使用 MongoDB 的 $lookup 呢,又麻烦,又丧失了 Mongoose 的不少便捷功能。

假设构建一个 method ,手动把搜索条件替换成符合搜索条件的 ObjectId 数组,又得特事特办,很麻烦。

所以,不如现在来使用 MongooseFindByReference 模块,它会自动把对参考字段的搜索,替换成符合搜索条件的 ObjectId 数组。

使用后,搜索条件就会被替换成:

const oldConditions = {
    $and: {
      parents: {
        'owner.name': 'Dean',
      },
      sex: 0,
    },
  };

const newConditions = {
  $and: {
    parents: {
      $in: [/* 符合条件的猫的 ObjectId 数组 */],
    },
    sex: 0,
  },
};

NPM 链接 Github 链接

欢迎下载,欢迎给 Star 嘿嘿

npm i mongoose-find-by-reference
6859 次点击
所在节点    Node.js
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/832799

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX