我有一个非常简单的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是一个引用,并且在查找返回文档之后才会填充它。
只是旁注,模式比这更复杂,并且其中有其他参考可以是循环的。为简单起见,我没有把它们包括在内,但基本的想法就在那里。如果它真的很简单,我会使用子文档,它将按预期工作。
有更好的方法可以做到这一点,所以我得到了预期的文件吗?
答案 0 :(得分:1)
您现在可以使用$lookup
$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