Mongoose查询需要填充的数据

时间:2017-02-16 22:54:26

标签: node.js mongodb mongoose mongoose-populate

我有一个非常简单的Mongoose模型:

aclSchema = mongoose.Schema({
    _id: String,
    public_read: Boolean,
    public_write: Boolean,
});
aclModel = mongoose.model('acl', aclSchema);

另一个引用它的模型:

thingSchema = mongoose.Schema({
    _id: String,
    _acl: { type: String, ref: 'acl' }
});
thingModel = mongoose.model('thing', thingSchema);

我需要能够找到_acl.public_read为true的文档(thingModel)。我遇到的问题是,因为thing._acl是一个引用,所以在查询完成之后才会填充它。

示例:

thingModel.find({"_acl.public_read":true}).populate('_acl').exec(callback);

返回没有结果,因为,我猜,_acl是一个引用,并且在查找返回文档之后才会填充它。

只是旁注,模式比这更复杂,并且其中有其他参考可以是循环的。为简单起见,我没有把它们包括在内,但基本的想法就在那里。如果它真的很简单,我会使用子文档,它将按预期工作。

有更好的方法可以做到这一点,所以我得到了预期的文件吗?

1 个答案:

答案 0 :(得分:1)

您现在可以使用$lookup

在Mongo 3.2中执行此操作

$lookup需要四个参数

from:指定同一数据库中的集合以执行连接。 from集合无法分片。

localField:指定输入到$ lookup阶段的文档中的字段。 $ lookup通过from集合的文档在localField上执行与foreignField的相等匹配。

foreignField:指定from集合中文档的字段。

as:指定要添加到输入文档的新数组字段的名称。新数组字段包含来自集合的匹配文档。

thingModel.aggregate([{

  $lookup: {
     from: 'aclCollection',
     localField: '_acl',
     foreignField: '_id',
     as : 'acl'
  },
  {$unwind: '$acl'},
  {$match:{"acl.public_read":true }}
], callback);

如果是填充,则无法直接进行填充。参考类似的问题 Mongoose nested query on Model by field of its referenced model