首页 > 解决方案 > 如何从文档中检索数组中的单个对象

问题描述

我正在努力从文档中的数组中检索单个对象,其中键systemDelete_DT为空 - 我尝试过的所有内容要么检索整个数组,要么什么都不检索。

在下面的示例中,我只想检索_id匹配map.groupIdandmap.systemDelete_DT为空的对象。

我试过使用$elemMatch$filter其他......无济于事。

如何仅检索_id匹配map.groupIdandmap.systemDelete_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")
        },
        
      ],
      
    }
  ]
}

现场演示

标签: mongodbaggregation-framework

解决方案


您可以使用

  • $unwind解构数组
  • $group重建数组
  • $and是确保两个条件都为真

这是代码

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
    }
  }
])

工作Mongo游乐场


推荐阅读