Arrays Mongo DB在多个嵌套数组的数组中查找值
我需要检查ObjectId是否存在于非嵌套数组和多个嵌套数组中,我使用聚合框架成功地接近了ObjectId,但在最后一步中被卡住了 我的文档具有以下结构:Arrays Mongo DB在多个嵌套数组的数组中查找值,arrays,mongodb,aggregation-framework,Arrays,Mongodb,Aggregation Framework,我需要检查ObjectId是否存在于非嵌套数组和多个嵌套数组中,我使用聚合框架成功地接近了ObjectId,但在最后一步中被卡住了 我的文档具有以下结构: { "_id" : ObjectId("605ce5f063b1c2eb384c2b7f"), "name" : "Test", "attrs" : [ ObjectId("6058e94c3
{
"_id" : ObjectId("605ce5f063b1c2eb384c2b7f"),
"name" : "Test",
"attrs" : [
ObjectId("6058e94c3994d04d28639616"),
ObjectId("6058e94c3994d04d28639627"),
ObjectId("6058e94c3994d04d28639622"),
ObjectId("6058e94c3994d04d2863962e")
],
"variations" : [
{
"varName" : "Var1",
"attrs" : [
ObjectId("6058e94c3994d04d28639616"),
ObjectId("6058e94c3994d04d28639627"),
ObjectId("6058e94c3994d04d28639622"),
ObjectId("60591791d4d41d0a6817d23f")
],
},
{
"varName" : "Var2",
"attrs" : [
ObjectId("60591791d4d41d0a6817d22a"),
ObjectId("60591791d4d41d0a6817d255"),
ObjectId("6058e94c3994d04d28639622"),
ObjectId("60591791d4d41d0a6817d23f")
],
},
],
"storeId" : "9acdq9zgke49pw85"
}
假设我需要检查此id是否存在于所有名为attrs
的数组中
我的聚合查询如下所示:
db.product.aggregate([
{
$match: {
storeId,
},
},
{
$project: {
_id: 0,
attrs: 1,
'variations.attrs': 1,
},
},
{
$project: {
attrs: 1,
vars: '$variations.attrs',
},
},
{
$unwind: '$vars',
},
{
$project: {
attr: {
$concatArrays: ['$vars', '$attrs'],
},
},
},
]);
其结果是:
[
{
attr: [
6058e94c3994d04d28639616,
6058e94c3994d04d28639627,
6058e94c3994d04d28639622,
6058e94c3994d04d2863962e,
6058e94c3994d04d28639616,
6058e94c3994d04d28639627,
6058e94c3994d04d28639622,
60591791d4d41d0a6817d23f,
60591791d4d41d0a6817d22a,
60591791d4d41d0a6817d255,
6058e94c3994d04d28639622,
60591791d4d41d0a6817d23f
]
},
{
attr: [
60591791d4d41d0a6817d22a,
60591791d4d41d0a6817d255,
6058e94c3994d04d28639622,
60591791d4d41d0a6817d23f,
6058e94c3994d04d28639624,
6058e94c3994d04d28639627,
6058e94c3994d04d28639628,
6058e94c3994d04d2863963e
]
}
]
假设我的数据库中有两个产品,我得到这个结果。最外层数组中的每个元素都是不同的产品
最后一位是检查此键的“6058E94C3994D044D28639616”
,我找不到使用$group
的方法,因为我没有要分组的键。
或者使用$match
,将其添加到聚合的末尾:
{
$match: {
attr: "6058e94c3994d04d28639616",
},
},
但这会导致一个空数组。我知道$match
不会像这样查询数组,但也找不到使用$in
的方法
这是不是太复杂了?我不能将原始数据嵌入其中,因为它是可变的,如果某些东西发生了变化,我不愿意更改所有产品
如果我有10000种产品,这会很贵吗
提前感谢您正在尝试将字符串
6058E94C3994D044D28639616
与ObjectId进行比较。执行以下操作时,使用运算符将字符串转换为ObjectId:
db.product.aggregate([
{
$match: {
storeId,
},
},
{
$project: {
_id: 0,
attrs: 1,
'variations.attrs': 1,
},
},
{
$project: {
attrs: 1,
vars: '$variations.attrs',
},
},
{
$unwind: '$vars',
},
{
$project: {
attr: {
$concatArrays: ['$vars', '$attrs'],
},
},
},
]);
{
$match:{
$expr:{
$in:[{$toObjectId:“6058e94c3994d04d28639616”},“$attr”]
}
}
}
当\u id
匹配时,您期望的输出格式是什么?此外,查询不会在您的问题中产生“结果”。我希望任何东西都能让我检查密钥是否存在。这个查询的结果和我发布的完全一样,我只是复制粘贴了它。是的!!我不包括$expr
,这使它工作起来了!非常感谢你!