【发布时间】:2016-12-11 15:11:31
【问题描述】:
我收集了 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 数组的文档,其中所有元素都有nids,如[0, 10, *]。顺序很重要,所以[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 的结果,但我需要两者并按照确切的顺序。
这可能吗?
【问题讨论】:
-
希望您知道这一点。
$elemMatch将只返回一条与查询匹配的记录。 -
@Shrabanee 感谢您指出这一点。但我知道它将匹配至少一个包含该字段的元素。
-
@Shrabanee 你的建议是错误的。根据documentation,
$elemMatch运算符匹配包含一个数组字段的 documents,其中至少一个元素匹配所有指定的查询条件。一般情况下它不会只返回一条记录,如果它的数组字段中至少有一个元素匹配所有指定的查询条件,它会返回记录。 -
你想只返回那些对数组进行排序的文档吗?这背后的逻辑很难理解。
标签: arrays mongodb mongodb-query