【问题标题】:Project and filter double nested array mongodb项目和过滤双嵌套数组mongodb
【发布时间】:2022-01-24 16:46:39
【问题描述】:
{
   "id":"",
   "data0":"",
   "data1":[
      {
         "data2":[
            {
               "name":"Man 1",
               "_id":"5e8c242f751d0074ca004a"
            },
            {
               "name":"Man 2",
               "_id":"605d403dab6100e1395697"
            },
            {
               "name":"Man 3",
               "_id":"5e8c2d39751d0074ca0050"
            }
         ]
      },
      {
         "data2":[
            {
               "name":"Man 4",
               "_id":"5ed4efc71224005abea7eb"
            },
            {
               "name":"Man 5",
               "_id":"5e8c249539751d04ca0056"
            },
            {
               "name":"Man 6",
               "_id":"5e8c239a39751d0074c046"
            }
         ]
      }
   ]
}

上面的文档是我的数据结构。有没有一种方法可以过滤名称为 Man 3 的数组 (data1) 的元素。我只想显示名称为 Man 3 的数组元素。我有这段代码,但它不起作用。这是示例。

                    pipeLine.push(
                    { $project: { 
                        'data1' : {
                            $filter: {
                                input: '$data1.data2',
                                as: 'test',
                                cond: { $eq : ['$$test.name', "Man 3" ]}
                            }
                        }
                     }}
                )

预期的输出是这样的。

{
   "id":"",
   "data0":"",
   "data1":[
      {
         "data2":[
            {
               "name":"Man 1",
               "_id":"5e8c242f751d0074ca004a"
            },
            {
               "name":"Man 2",
               "_id":"605d403dab6100e1395697"
            },
            {
               "name":"Man 3",
               "_id":"5e8c2d39751d0074ca0050"
            }
         ]
      }
   ]
}

【问题讨论】:

    标签: node.js mongodb aggregation-framework


    【解决方案1】:

    您应该使用$in 运算符来检查“Man 3”是否在data1.data2.name 中,此路径将返回名称数组。

    db.collection.aggregate([
      {
        $project: {
          "data1": {
            $filter: {
              input: "$data1",
              cond: {
                $in: [
                  "Man 3",
                  "$$this.data2.name"
                ]
              }
            }
          }
        }
      }
    ])
    

    Sample Mongo Playground

    【讨论】:

      【解决方案2】:

      如果您只想要那个过滤器,您可以使用 find 查询而不是聚合:

      db.collection.find({
        "data1.data2.name": "Man 3"
      },
      {
        "id": 1,
        "data0": 1,
        "data1.data2.$": 1
      })
      

      例如here

      此外,如果您想要聚合阶段,请使用 $in 而不是 $eq

      db.collection.aggregate([
        {
          "$project": {
            "id": 1,
            "data0": 1,
            "data1": {
              "$filter": {
                "input": "$data1",
                "as": "d",
                "cond": {
                  "$in": [
                    "Man 3",
                    "$$d.data2.name"
                  ]
                }
              }
            }
          }
        }
      ])
      

      例如here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-17
        • 2018-03-01
        • 2017-09-11
        • 2019-12-07
        • 2018-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多