如何从对象中获取文档与对象相比?自定义过滤功能?

时间:2017-02-08 18:22:04

标签: mongodb mongodb-query

我有一个对象:

{
 name: "John",
 size: 10,
 volume: 20
}

收集文件:

[{
 id:1,
 name: "Sara",
 size: 10
},
{
 id:2,
 volume: 20
},
{
 id:3,
 name: "John",
 size: 10
},
{
 id:4,
 size: 20
}]

现在我需要使用object过滤我的集合 - 如果每个文档中的每个字段(除了id)都存在于object中并且值相等 - 那么这个文档应该在查询结果中:

[{             
 id:1,  //!EXCLUDE - name not Sara
 name: "Sara", 
 size: 10 
},
{
 id:2,  //OK - volume matches volume in object - return document in results
 volume: 20    
},
{
 id:3,  //OK - name and size matches object - return in results
 name: "John",
 size: 10
},
{
 id:4,  //!EXCLUDE - size don't match size on object
 size: 20
}]

所以最后的回答是:

[{
 id:2,  //OK - volume matches volume in object - return document in results
 volume: 20    
},
{
 id:3,  //OK - name and size matches object - return in results
 name: "John",
 size: 10
}]

我怎么能用mongo find或其他人来做?也许我应该编写自定义过滤功能?

1 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情。

查询将选择所有文档,其中每个字段存在且等于该值。

db.collection.find({
    $and: [{
        $or: [{
            name: {
                $exists: false
            }
        }, {
            name: "John"
        }]
    }, {
        $or: [{
            size: {
                $exists: false
            }
        }, {
            size: 10
        }]
    }, {
        $or: [{
            volume: {
                $exists: false
            }
        }, {
            volume: 20
        }]
    }]
})