V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Cheez
V2EX  ›  Node.js

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

  •  
  •   Cheez · 2022-02-10 00:20:01 +08:00 · 6956 次点击
    这是一个创建于 1053 天前的主题,其中的信息可能已经有所发展或是发生改变。

    相信不少使用 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
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2221 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:39 · PVG 09:39 · LAX 17:39 · JFK 20:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.