Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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
Mongodb 如何从文档检索数组中的单个对象_Mongodb_Aggregation Framework - Fatal编程技术网

Mongodb 如何从文档检索数组中的单个对象

Mongodb 如何从文档检索数组中的单个对象,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正在努力从文档中的数组中检索单个对象,其中键systemDelete\u DT为空-我尝试的所有操作要么检索整个数组,要么什么也不检索 在下面的示例中,我只想检索\u id与map.groupId匹配且map.systemDelete\u DT为空的对象 我尝试过使用$elemMatch和$filter等工具。。。。无济于事 如何仅检索\u id与map.groupId匹配且map.systemDelete\u DT为空的对象 我的查询 db.collection.aggregate([

我正在努力从文档中的数组中检索单个对象,其中键
systemDelete\u DT
为空-我尝试的所有操作要么检索整个数组,要么什么也不检索

在下面的示例中,我只想检索
\u id
map.groupId
匹配且
map.systemDelete\u DT
为空的对象

我尝试过使用
$elemMatch
$filter
等工具。。。。无济于事

如何仅检索
\u id
map.groupId
匹配且
map.systemDelete\u DT
为空的对象

我的查询

db.collection.aggregate([
  {
    $lookup: {
      from: "products",
      let: {
        id: "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$$id",
                "$map.groupId"
              ]
            },
            
          },
          
        },
        {
          $project: {
            _id: 1,
            "map.groupId": 1,
            
          },
          
        },
        
      ],
      as: "p_map",
      
    },
    
  },
  {
    $project: {
      p_map: 1
    }
  }
])
预期结果

    {
      "_id": ObjectId("609bc0c7c2a4e3164662238a"),
      "systemDelete_DT": null,
      "groupId": ObjectId("6099619baa04f15c3fb67a83")
    }
示例集合

db={
  "collection": [
    {
      "_id": ObjectId("6099619baa04f15c3fb67a83")
    }
  ],
  "products": [
    {
      "_id": ObjectId("608d92fdc90b0ea83a8b52bb"),
      "map": [
        {
          "_id": ObjectId("609bc0c7c2a4e3164662238a"),
          "systemDelete_DT": null,
          "groupId": ObjectId("6099619baa04f15c3fb67a83")
        },
        {
          "_id": ObjectId("609bc0c7c2a4e3164662238a"),
          "systemDelete_DT": "2021-05-14T15:01:20+01:00",
          "groupId": ObjectId("6099619baa04f15c3fb67a83")
        },
        {
          "_id": ObjectId("609bd0bbaffb7018a41c2f1e"),
          "systemDelete_DT": "2021-05-12T13:57:34+01:00",
          "groupId": ObjectId("609964e44cc4275e520d3df0")
        },
        {
          "_id": ObjectId("609c019bad4cd31e7bc569bf"),
          "systemDelete_DT": "2021-05-12T17:26:43+01:00",
          "shopifyId": "6670290944179",
          "groupId": ObjectId("6099a006a8480e782ddc1d87")
        },
        
      ],
      
    }
  ]
}
您可以使用

  • $unwind
    解构阵列
  • $group
    重建阵列
  • $和
    用于确保这两个条件均为真
这是密码

db.collection.aggregate([
  {
    $lookup: {
      from: "products",
      let: { id: "$_id" },
      pipeline: [
        { $unwind: "$map" },
        {
          $match: {
            $expr: {
              $and: [
                { $eq: [ "$$id", "$map.groupId" ] },
                { $eq: [ "$map.systemDelete_DT", null ] }
              ]
            }
          }
        },
        {
          $group: {
            _id: "$_id",
            map: { $push: "$map" }
          }
        }
      ],
      as: "p_map",
      
    }
    
  },
  {
    $project: {
      p_map: 1
    }
  }
])
工作

您可以使用

  • $unwind
    解构阵列
  • $group
    重建阵列
  • $和
    用于确保这两个条件均为真
这是密码

db.collection.aggregate([
  {
    $lookup: {
      from: "products",
      let: { id: "$_id" },
      pipeline: [
        { $unwind: "$map" },
        {
          $match: {
            $expr: {
              $and: [
                { $eq: [ "$$id", "$map.groupId" ] },
                { $eq: [ "$map.systemDelete_DT", null ] }
              ]
            }
          }
        },
        {
          $group: {
            _id: "$_id",
            map: { $push: "$map" }
          }
        }
      ],
      as: "p_map",
      
    }
    
  },
  {
    $project: {
      p_map: 1
    }
  }
])
工作

  • $match
    systemDelete\u DT
    null条件
  • $filter
    迭代映射循环并按这两个条件进行过滤
  • $arrayElemAt
    从地图中选择第一个对象
  • $replaceRoot
    使用
    $arrayElemAt

  • $match
    systemDelete\u DT
    null条件
  • $filter
    迭代映射循环并按这两个条件进行过滤
  • $arrayElemAt
    从地图中选择第一个对象
  • $replaceRoot
    使用
    $arrayElemAt

嗨,我不确定我做了什么不同的事情……这救了我!非常感谢。哈哈,希望两者都是对的。。有时最终数组可能/可能不包含我没有使用的对象
$arrayElemAt
。所以他最好使用
$ifNull
嗨,我不确定我做了什么不同的事情……这救了我!非常感谢。哈哈,希望两者都是对的。。有时最终数组可能/可能不包含我没有使用的对象
$arrayElemAt
。所以他最好使用
$ifNull