Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Mongo DB在多个嵌套数组的数组中查找值_Arrays_Mongodb_Aggregation Framework - Fatal编程技术网

Arrays Mongo DB在多个嵌套数组的数组中查找值

Arrays Mongo DB在多个嵌套数组的数组中查找值,arrays,mongodb,aggregation-framework,Arrays,Mongodb,Aggregation Framework,我需要检查ObjectId是否存在于非嵌套数组和多个嵌套数组中,我使用聚合框架成功地接近了ObjectId,但在最后一步中被卡住了 我的文档具有以下结构: { "_id" : ObjectId("605ce5f063b1c2eb384c2b7f"), "name" : "Test", "attrs" : [ ObjectId("6058e94c3

我需要检查ObjectId是否存在于非嵌套数组和多个嵌套数组中,我使用聚合框架成功地接近了ObjectId,但在最后一步中被卡住了

我的文档具有以下结构:

{
    "_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
,这使它工作起来了!非常感谢你!