使用Mongoose的.populate()方法返回特定字段

16 浏览
0 Comments

使用Mongoose的.populate()方法返回特定字段

当我运行查询之后,从MongoDB返回一个JSON值。问题是我不想返回与我的返回关联的所有JSON,我试过搜索文档,但没有找到正确的方法来做到这一点。我想知道是否可能,如果可能的话,正确的做法是什么。例如:\n在数据库中\n

{
    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"
    }
} 

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

 .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");
      }
    }
  }

0
0 Comments

问题的原因是在使用Mongoose的.populate()方法时,想要返回特定的字段,但是没有得到预期的结果。解决方法是在.populate()方法中添加一个select字段来指定要返回的字段。下面是解决问题的代码:

applicantListToExport: function (query, callback) {
  this
   .find(query).select({'advtId': 0})
   .populate({
      path: 'influId',
      model: 'influencer',
      select: { '_id': 1,'user':1},
      populate: {
        path: 'userid',
        model: 'User'
      }
   })
 .populate('campaignId',{'campaignTitle':1})
 .exec(callback);
}

这段代码的作用是在嵌套的.populate()和简单的.populate()中选择要返回的字段。通过在.populate()方法中添加一个select字段,可以指定要返回的字段,解决了原问题。

0
0 Comments

问题的原因是,当使用Mongoose的.populate()方法进行数据填充时,有时候只想返回填充文档的特定字段。默认情况下,Mongoose将返回填充文档的所有字段,但有时候只需要返回其中的一部分字段。

解决方法是,在.populate()方法的第二个参数中传入字段名的语法。通过这种方式,可以指定只返回特定的字段。

例如,可以使用以下代码来只返回填充文档的"name"字段:

Model
.findOne({ _id: 'bogus' })
.populate('the_field_to_populate', 'name') // 只返回Persons的name字段

如果想要返回更多的字段,只需在第二个参数中传入更多的字段名,如下所示:

Model
.findOne({ _id: 'bogus' })
.populate('the_field_to_populate', 'name lastname') // 返回Persons的name和lastname字段

如果需要填充多个模型并且想要返回这些模型的字段,可以使用以下代码:

Model.findOne({_id: 'foo'}).populate({
  path: 'parent-model',
  populate: {
    path: 'someProperty',
    populate: {
      path: 'somePropertyBelow'
    }
  }
})

通过以上方法,可以解决只返回填充文档的特定字段的需求。更多关于Mongoose的.populate()方法的信息,可以参考Mongoose官方文档中的Mongoose populate field selection部分。

0
0 Comments

问题的原因是使用`.populate()`方法无法返回指定的字段。解决方法是使用`.lean()`查询来修改输出,然后使用`.populate()`方法来填充字段,并在结果中进行后处理以保留想要的字段。以下是一个示例代码:

.Model.find()
.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;
    }
});

某些情况下这个解决方法对他们无效,他们尝试了各种不同的`.populate()`方法的组合,但仍然无法只返回指定的字段。他们怀疑这个问题可能是由于Mongoose的更新导致的。是否有其他人也遇到了相同的问题呢?

0