如何在mongodb中基于条件查询嵌入的对象数组

xfb7svmp  于 2023-01-16  发布在  Go
关注(0)|答案(1)|浏览(117)

我有一个对象数组嵌入在一个文档中,并且在一个集合中有多个这样的文档。我如何使用以下条件查询这些嵌入的对象数组(基于我下面的文档)?
1.首先获取"status""active"的对象(状态不会出现在所有对象中,而只会出现在少数对象中)
1.然后得到上面满足的对象的"parent_user_id",并将其与其余对象"parent_user_id"匹配,得到那些对象
1.上述条件的结果必须设置,而不是原始数组(即:"users")的对象,而不是所有存在的对象。因此,如果您查看结果,我预期用户数组中缺少3个元素,因为这些元素不满足上述条件。文档我在集合中(将有多个文档)

{
    "_id" : ObjectId("63a8808652f40e1d48a3d1d7"),
    "name" : "A",
    "description" : null,
    "users" : [
        {
            "id" : "63a8808c52f40e1d48a3d1da",
            "owner" : "John Doe",
            "purchase_date" : "2022-12-25,
            "status" : "active",
            "parent_user_id" : "63a8808c52f40e1d48a3d1da",
            "recent_items": ["tomato",onion]
        },
        {
            "id" : "63a880a552f40e1d48a3d1dc",
            "owner" : "John Doe 1",
            "purchase_date" : "2022-12-25,
            "parent_user_id" : "63a8808c52f40e1d48a3d1da",
            "recent_items": ["onion"]
        },
        {
            "id" : "63a880f752f40e1d48assddd"
            "owner" : "John Doe 2",
            "purchase_date" : "2022-12-25,
            "parent_user_id" : "63a8808c52f40e1d48a3d1da",
        },
        {
            "id" : "63a880f752f40e1d48a3d207"
            "owner" : "John Doe 11",
            "dt" : "2022-12-25,
            "status" : "inactive",
            "parent_user_id" : "63a880f752f40e1d48a3d207",
        },
        {
            "id" : "63a880f752f40e1d48agfmmb"
            "owner" : "John Doe 112",
            "dt" : "2022-12-25,
            "status" : "active",
            "parent_user_id" : "63a880f752f40e1d48agfmmb",
            "recent_items": ["tomato"]
        }
        {
            "id" : "63a880f752f40e1d48agggg"
            "owner" : "John SS",
            "dt" : "2022-12-25,
            "status" : "inactive",
            "parent_user_id" : "63a880f752f40e1d48agggg",
        }
        {
            "id" : "63a880f752f40e1d487777"
            "owner" : "John SS",
            "dt" : "2022-12-25,
            "parent_user_id" : "63a880f752f40e1d48agggg",
        }
    ]
}

预期结果

{
  "_id" : ObjectId("63a8808652f40e1d48a3d1d7"),
  "name" : "A",
  "description" : null,
        "users" : [
            {
                "id" : "63a8808c52f40e1d48a3d1da",
                "owner" : "John Doe",
                "purchase_date" : "2022-12-25,
                "status" : "active",
                "parent_user_id" : "63a8808c52f40e1d48a3d1da",
                "recent_items": ["tomato",onion]
            },
            {
                "id" : "63a880a552f40e1d48a3d1dc",
                "owner" : "John Doe 1",
                "purchase_date" : "2022-12-25,
                "parent_user_id" : "63a8808c52f40e1d48a3d1da",
            },
            {
                "id" : "63a880f752f40e1d48assddd"
                "owner" : "John Doe 2",
                "purchase_date" : "2022-12-25,
                "parent_user_id" : "63a8808c52f40e1d48a3d1da",
            },
            {
                "id" : "63a880f752f40e1d48agfmmb"
                "owner" : "John Doe 112",
                "dt" : "2022-12-25,
                "status" : "active",
                "parent_user_id" : "63a880f752f40e1d48agfmmb",
                "recent_items": ["tomato"]
            }
        ]
    }
vaqhlq81

vaqhlq811#

我将使用如下一些$filter级:

db.collection.aggregate([
  {
    $addFields: {
      users_matched: {
        $filter: {
          input: "$users",
          as: "user",
          cond: {
            $eq: [
              "active",
              "$$user.status"
            ],
            
          },
          
        },
        
      },
      
    },
    
  },
  {
    $set: {
      users: {
        $filter: {
          input: "$users",
          as: "user",
          cond: {
            $in: [
              "$$user.parent_user_id",
              "$users_matched.id"
            ],
            
          },
          
        },
        
      },
      
    },
    
  },
  {
    $unset: "users_matched"
  }
])

你可以在mongoplayground https://mongoplayground.net/p/SrpsWb4v21x上自己查看

相关问题