![](/img/trans.png)
[英]Mongodb: find documents with array where all elements exist in query array, but document array can be smaller
[英]Find document with array that consists exclusively particular documents in MongoDB
我有收集path_test
, path_test
有2个文件
文件1
{
"_id" : 1,
"tpc" : 5,
"path" : [
{
"nids" : [ 0, 10, 11 ],
"ctc" : 2
},
{
"nids" : [ 0, 10 ],
"ctc" : 2
},
{
"nids" : [ 0, 10, 21 ],
"ctc" : 1
}
]
}
文件2
{
"_id" : 2,
"tpc" : 5,
"path" : [
{
"nids" : [ 0, 10, 110 ],
"ctc" : 1
},
{
"nids" : [ 0, 10, 11 ],
"ctc" : 2
},
{
"nids" : [ 0, 5 ],
"ctc" : 2
}
]
}
我想要得到的结果是带有path
数组的文档,其中所有元素都有像[0, 10, *]
nids
[0, 10, *]
这样的nids
。 订单很重要,所以[10, 0, *]
将是错误的。 它应该找到文档1,但不是文档2.在开始使用map-reduce或聚合之前,希望我能用查询解决这个问题。
这是我到目前为止所尝试的
查询1
db.getCollection('path_test').find( {
"path": { $not: { $elemMatch: { "nids.0": { $nin: [0] }, "nids.1": { $nin: [10] } } } }
});
查询2
db.getCollection('path_test').find( {
"path.nids": { $not: { $elemMatch: { $nin: [0, 10] } } }
});
但是两个查询都给我结果,其中只有0在或只有10在,但我需要两个,并按照确切的顺序。
那可能吗?
至少没有一个意味着没有人
查询1
为简化起见,让我们分配
A = "nids.0": { $ne: 0 }
B = "nids.1": { $ne: 10 }
C = { A, B }
然后
{ "path" : { $elemMatch: C } }
将找到path
数组中至少有一个元素满足条件C
文档
{ "path" : { $not: { $elemMatch: C } } }
将找到path
数组中没有满足条件C
元素的文档。
文档1和文档2的path
数组中没有满足条件C
元素,因此Query1输出包含它们。 如果,fe,则添加到Document 1的path
数组中
{ "nids": [ 1, 11, 110], "ctc" : 1 }
然后,文档1将不在查询1的输出中,因为这个添加的元素满足C
查询2
为简化起见,让我们分配
C = { $nin: [0, 10] }
然后
{ "path.nids" : { $not: { $elemMatch: C } } }
将找到满足条件C
path.nids
数组中没有元素的文档。
path.nids
数组中的文档1和文档2具有满足条件C
元素,因此查询2输出不包含它们。 如果,fe,你添加到收藏文件
{ "_id" : 6, "tpc" : 5, "path" : [ { "nids" : [ 0, 10 ], "ctc" : 1 } ] }
然后它将在查询2的输出中,因为在path.nids
数组中没有满足C
元素。
解
在查询1中替换
{ $elemMatch: { "nids.0": { $nin: [0] }, "nids.1": { $nin: [10] } } }
同
{ $elemMatch: { $or: [ { "nids.0": { $ne: 0 } }, { "nids.1": { $ne: 10 } } ] } }
这个新的Query将找到文件,其中path
数组中没有元素满足条件A
和B
至少一个。 因此,它将找到文档1,但不是文档2(其中"nids" : [ 0, 5 ]
不满足条件B
请注意, { $ne: 10 }
相当于{ $nin: [10] }
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.