json MongoDB集合中数组的嵌套查询

vbkedwbf  于 2022-11-19  发布在  Go
关注(0)|答案(1)|浏览(175)

我有下面的用户集合,我希望查找/更新查询更新嵌套数组元素。

{
_id:"000-0000-0001",
Roles :{
         0000-0000-0011: //EngagementId
        ["0000-0000-0111", "0000-0000-0112", "0000-0000-3333"],//RoleId
         "0000-0000-0012" : 
        ["0000-0000-0121", "0000-0000-0112"]
       }
},
{

_id:"000-0000-0002",
Roles :{
         "0000-0000-0021" : [ "0000-0000-0222", "0000-0000-0112"],
         "0000-0000-0022" : [ "0000-0000-0121", "0000-0000-0112"],
         "0000-0000-0022" : [ "0000-0000-0121", "0000-0000-0112", "0000-0000-3333"]
       }
}

要求:如果阵列具有0000-0000-3333和0000-0000-0112的组合,我想提取RoleId 0000-0000-3333
以下是预期结果:

{
_id:"000-0000-0001",
Roles :{
         "0000-0000-0011" : ["0000-0000-0111", "0000-0000-0112"],
         "0000-0000-0012" : ["0000-0000-0121", "0000-0000-0112"]
       }
},
{

_id:"000-0000-0002"
Roles :{
         "0000-0000-0021" : [ "0000-0000-0222", "0000-0000-0112"],
         "0000-0000-0022" : [ "0000-0000-0121", "0000-0000-0112"],
         "0000-0000-0022" : [ "0000-0000-0121", "0000-0000-0112"]
       }
}

注意:Find/update将对Key:value起作用,或者如果它是嵌套的,则对key.key:value起作用,但在上面的例子中,我们有key.value.[values]:$pull(value),这是一个挑战。

ghhkc1vu

ghhkc1vu1#

数据模型需要一个复杂的update和一个管道。
这里有一种方法。

db.collection.update({
  "Roles": {"$exists": true}
},
[
  {
    "$set": {
      "Roles": {
        "$arrayToObject": {
          "$map": {
            "input": {"$objectToArray": "$Roles"},
            "as": "roleKV",
            "in": {
              "k": "$$roleKV.k",
              "v": {
                "$cond": [
                  {
                    "$and": [
                      {"$in": ["0000-0000-0112", "$$roleKV.v"]},
                      {"$in": ["0000-0000-3333", "$$roleKV.v"]}
                    ]
                  },
                  {
                    "$filter": {
                      "input": "$$roleKV.v",
                      "cond": {"$ne": ["$$this", "0000-0000-3333"]}
                    }
                  },
                  "$$roleKV.v"
                ]
              }
            }
          }
        }
      }
    }
  }
],
{"multi": true}
)

mongoplayground.net上试试。

相关问题