从 Mongoose 返回带有 .populate() 的某些字段

2022-08-30 05:33:21

运行查询后,我从MongoDB返回了一个JSON值。问题是我不想返回与我的返回相关的所有JSON,我尝试搜索文档,但没有找到正确的方法来执行此操作。我想知道如果有可能,该怎么办,如果是这样,这样做的正确方法是什么。示例:在数据库中

{
    user: "RMS",
    OS: "GNU/HURD",
    bearded: "yes",
    philosophy: {
        software: "FOSS",
        cryptology: "Necessary"
    },
    email: {
        responds: "Yes",
        address: "rms@gnu.org"
    },
    facebook: {}
}

{
    user: "zuckerburg",
    os: "OSX",
    bearded: "no",
    philosophy: {
        software: "OSS",
        cryptology: "Optional"
    },
    email: {},
    facebook: {
        responds: "Sometimes",
        address: "https://www.facebook.com/zuck?fref=ts"
    }
} 

如果某个字段对于用户存在,但如果它不返回另一个字段,那么返回该字段的正确方法是什么?对于上面的示例,我希望返回 RMS 的字段和 Zuckerburg 的字段。这就是我试图找到的字段是否为空,但它似乎不起作用。[email][address][facebook][address]

 .populate('user' , `email.address`)
  .exec(function (err, subscription){ 
    var key;
    var f;
    for(key in subscription){
      if(subscription[key].facebook != null  ){
          console.log("user has fb");
      }
    }
  }

答案 1

我不完全清楚“返回字段”是什么意思,但您可以使用查询,以便您可以自由地修改输出,然后填充两个字段并对结果进行后处理,以仅保留所需的字段:lean()

.lean().populate('user', 'email.address facebook.address')
  .exec(function (err, subscription){ 
    if (subscription.user.email.address) {
        delete subscription.user.facebook;
    } else {
        delete subscription.user.email;
    }
  });

答案 2

如果只想为填充的文档返回几个特定字段,则可以通过将字段名称语法作为第二个参数传递给 populate 方法来实现此目的。

Model
.findOne({ _id: 'bogus' })
.populate('the_field_to_populate', 'name') // only return the Persons name
...

请参阅猫鼬填充字段选择