gpt4 book ai didi

arrays - 在 MongoDB 中查找包含专门包含特定文档的数组的文档

转载 作者:可可西里 更新时间:2023-11-01 09:39:47 25 4
gpt4 key购买 nike

我有集合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,但我需要两者,而且顺序完全相同。

这可能吗?

最佳答案

not at least one means noone

查询 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 输出包含这两个元素。例如,如果您添加到文档 1 的 path 数组

{ "nids": [ 1, 11, 110], "ctc" : 1 }

那么文档 1 将不会出现在查询 1 的输出中,因为这个添加的元素满足 C

查询 2

为了简化,让我们赋值

C = { $nin: [0, 10] }

然后

{ "path.nids" : { $not: { $elemMatch: C } } }

将查找 path.nids 数组中没有满足条件 C 的元素的文档。

path.nids 数组中的文档 1 和文档 2 具有满足条件 C 的元素,因此查询 2 的输出不包含它们。如果,f.e,你添加到你的集合文档中

{ "_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 } } ] } }

这个新查询将查找 path 数组中没有元素至少满足条件 AB 之一的文档。因此,它将找到文档 1,但找不到文档 2(其中 "nids": [ 0, 5 ] 不满足条件 B

请注意,{ $ne: 10 } 等同于 { $nin: [10] }

关于arrays - 在 MongoDB 中查找包含专门包含特定文档的数组的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38785232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com