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

Mongodb 与对象相比,如何从集合中获取文档?自定义过滤功能?,mongodb,mongodb-query,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中,并且值相等-则此文档应位于查询结果

我有一个目标:

{
 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或其他软件?也许我应该写我的自定义过滤函数

你可以试试这样的东西

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

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

问题是,我可以在对象和每个文档中有10个或更多字段。在这种情况下,$或条件的组合太多,也许我可以在我的js代码中以某种方式生成这个条件对象-这是一个好的解决方案吗?看起来我会有10个属性的大量组合-每个属性与其他属性中的任何一个,每个属性与其他属性中的任何两个,等等…你只需要测量性能。我不确定组合部分。如果您有10个属性,则需要10个or条件。您将获得上述所有文档,因为您需要$or作为存在和值,后面是$and,将所有or组合加在一起。尝试运行它,如果它不起作用,请发布一个sample.db.collection.find{$and:[{$or:[{a1:{$exists:false},{a1:John}},{$or:[{a2:{$exists:false},{a2:10}}…更多或更多条件]}类似这样的东西。