1

我需要一种有效的方法来查找集合中的所有文档,其中它们的属性是传入对象属性的子集。

例子:

PassedObject: { 
    name: "Joe",
    age: 55,
    sex: "male"
}

collection: [
    one: {
        age: 55
    },
    two: {
        sex: "male",
        age: 18
    },
    three: {
        sex: "male",
        age: 55
    },
    four: {
        sex: "female",
        age: 22
    },
    five: {
        make: "LG",
        model: "24EN43"
    }
]

匹配的记录将是一和三。我想出了一种使用$orsinside of的方法来执行此操作$ands,检查属性是否不存在或等于该值,但这很慢,并且还会产生误报(例如,文档五(make:LG)会被退回)。

4

1 回答 1

0

以下代码可以解决问题

db.searchTest.find({$and:[{$or:[{name:{$exists:false}},{name:"Joe"}]},{$or:[{age:{$exists:false}},{age:55}]},{$or:[{sex:{$exists:false}},{sex:"male"}]},{$or:[{name:{$exists:true}},{age:{$exists:true}},{sex:{$exists:true}}]}]})

为了提高效率,您需要在数据上构建适当的索引

于 2013-09-06T19:16:29.753 回答