mongoose查询需要填充的数据

我有一个很简单的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); 

我需要能够find文件(thingModel)_acl.public_read是真实的。 我遇到的问题是,因为thing._acl是ref,所以直到查询完成后才填充它。

例:

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

这不会返回任何结果,因为,我猜,_acl是一个ref,它不会填充,直到查找返回文档之后。

只是一个侧面说明,模式比这更复杂,其他的参考文件可能是循环的。 为了简单起见,我没有把它们包括在内,但是基本的想法就在那里。 如果这真的很简单,我会使用子文件,它会按预期工作。

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

你现在可以在Mongo 3.2中使用$lookup来做到这一点

$lookup需要四个参数

from :指定在同一个数据库中执行连接的集合。 从收集不能被分割。

localField :指定文档input到$ lookup阶段的字段。 $ lookup在localField中执行从from集合的文档到ForeignField的平等匹配。

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

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

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

在填充的情况下,这是不可能的。 参考类似的问题Mongoose在模型上对其引用模型的字段进行嵌套查询