2017-02-16 87 views
1

猫鼬查询数据我有一个猫鼬模型,这是非常简单的:需要填充

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

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

例如:

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

这是因为,我想不返回任何结果,_acl是一个参考,它不是填充,直到找到返回文件后。

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

有没有更好的方法来做到这一点,所以我得到预期的文件?指定在同一数据库中收集到执行与连接:

回答

1

现在可以使用$lookup

$lookup有四个参数

from做在蒙戈3.2。来自收藏集不能被分割。

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

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

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

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

+0

正是我所需要的。任何已知的方式在<3.2? – Alex

+0

@Alex答案已更新。 http://stackoverflow.com/questions/19380738/mongoose-nested-query-on-model-by-field-of-its-referenced-model – sidgate