我想以这样一种方式查询mongoDB,即以对象数组的形式传递查询。 每个对象都是
的形式{
name: "<someName>",
someArr: [<someArr>]
}
现在,我想以这样的方式查询数据库:为了使文档适合查询,它必须满足两个条件:
如果查询是单个对象,我可以使用$ match和$ unwind查询它。
所以我想知道是否可以使用mongoDB的对象数组进行查询,还是必须为每个查询对象进行循环?
由于
一个例子:
如果查询是:
[
{name: "test", someArr: [1,2]},
{name: "test2", someArr: [3]}
]
数据库包含以下内容:
[
{name: "test3", someArr: [1,2]},
{name: "test", someArr: [1]},
{name: "test2", someArr: [4]}
]
查询结果应为
[{name: "test", someArr: [1]}]
因为它只匹配两个条件。
答案 0 :(得分:1)
这里没有必要“聚合”任何东西。这是一个简单的查询。您所做的就是将您的初始“查询阵列”转换为所需的实际查询DSL。而这只是在someArr
上加$in
并将整个数组提供给$or
:
var conditions = [
{name: "test", someArr: [1,2]},
{name: "test2", someArr: [3]}
];
db.collection.find({
"$or": conditions.map( c => Object.assign(c, { someArr: { "$in": c.someArr } }) )
})
为清楚起见,这个变换从源数组产生了这个:
db.collection.find({
"$or": [
{name: "test", someArr: { "$in": [1,2] } },
{name: "test2", someArr: { "$in": [3] } }
]
})
然后返回正确的文档。
“子集”有效地意味着“共享至少一个元素”,这就是$in
作为查询运算符所做的事情。因此,除非是出于投影目的,否则无需进行任何进一步的计算。