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


82

运行查询后,我从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"
    }
} 

如果用户存在该字段,但不返回其他字段,则返回该字段的正确方法是什么?对于上面的示例,我想返回[email][address]RMS[facebook][address]字段和Zuckerburg字段。这就是我尝试查找的字段是否为空,但是它似乎没有起作用的原因。

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

Answers:


89

对于“返回字段”的含义,我还不清楚,但是您可以使用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;
    }
  });

1
这对我不起作用,有人知道猫鼬更新是否已更改?
Ninja Coding

1
这不是为我工作要么,我试过.populate('model', 'field').populate('model', { field: 1}).populate('model', [field])有和没有lean()有和没有selectPopulatedPaths: false的模型,但我总是得到的回应充分填充对象。文档说您的答案应该是正确的,但我无法解决。有人有同样的问题吗?
mel-mouk '19

51

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

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

请参阅猫鼬填充字段选择


7
工作正常。您还可以返回更多字段,只有您必须传递更多字段。-> populate('the_field_to_populate','name lastname')
slorenzo

如果您有多个模型可以填充并需要这些模型,该怎么办?像populate('users posts','name')?您会为两者取名字吗?
MoDrags

这样的东西:Model.findOne({_ id:'foo'})。populate({路径:'父模型',填充:{路径:'someProperty',填充:{路径:'somePropertyBelow'}}})
dontmentionthebackup

28

尝试这样做:

User.find(options, '_id user email facebook').populate('facebook', '_id pos').exec(function (err, users) {

24

尝试这样做:

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

只是为了解释一下这里发生了什么:这是在嵌套填充和简单填充中选择字段。
安德烈·西蒙

您救了我的一天:)
Peshraw H. Ahmed


3

您尝试:

Post.find({_id: {$nin: [info._id]}, tags: {$in: info.tags}}).sort({_id:-1})
.populate('uid','nm')
.populate('tags','nm')
.limit(20).exec();

2

只是为了补充上面的答案,如果您想包括所有内容但仅排除某些属性,则可以执行以下操作:

.populate('users', {password: 0, preferences: 0})

0

嗨,对我来说,它为我工作,我使用填充代码填充了用户字段:--->

async function displayMessage(req,res,next){
    try{
        let data= await Msg.find().populate("user","userName userProfileImg","User")
               if(data===null) throw "Data couldn ot be loaded server error"
        else {
            res.status(200).json(data)
        }
    }   catch(err){
            next(err)
    }
}

我直接得到结果。这里的字段userName,userProfile image是ive选择性地需要的字段,并且填充的语法是:->

 .populate("user field to populate","fields to display with spaces between each of them " , "modelName ")

每个参数都应使用反逗号。

下面是我收到的输出。您无需担心填充子文档ID的另一件事,您将自动获得它们。

[
    {
        "_id": "5e8bff324beaaa04701f3bb9",
        "text": "testing message route",
        "user": {
            "_id": "5e8bf062d3c310054cf9f293",
            "userName": "boss",
            "userProfileImg": "img"
        },
        "__v": 0
    },
    {
        "_id": "5e8bff8dd4368a2858e8f771",
        "text": "testing message route second",
        "user": {
            "_id": "5e8bf062d3c310054cf9f293",
            "userName": "boss",
            "userProfileImg": "img"
        },
        "__v": 0
    },
    {
        "_id": "5e8c0c08e9bdb8209829176a",
        "text": "testing message route second",
        "user": {
            "_id": "5e8bf062d3c310054cf9f293",
            "userName": "boss",
            "userProfileImg": "img"
        },
        "__v": 0
    },
    {
        "_id": "5e8c0e0bcb63b12ec875962a",
        "text": "testing message route fourth time",
        "user": {
            "_id": "5e8bf062d3c310054cf9f293",
            "userName": "boss",
            "userProfileImg": "img"
        },
        "__v": 0
    }
]

0

在以下查询中,我检索了符合条件show=true的文章,检索到的数据title and createdAt 还检索了文章的类别,仅是类别的标题及其ID。

let articles = await articleModel
        .find({ show: true }, { title: 1, createdAt: 1 })
        .populate("category", { title: 1, _id: 1 });

-1

您可以尝试在下面使用,

 Model
    .find()
    .populate({path: 'foreign_field', ['_id', 'name']}) // only return the Id and Persons name
    ...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.