首页 > 解决方案 > 我怎样才能在 mongodb 中做到这一点?那可能吗?

问题描述

假设我的收藏有 3 个文档:

{
    "_id" : ObjectId("5b759065bfd90aa9cc925349"),
    "path" : "aa/bb",
    "data" : {
    "a" : "b"
    }
}

{
    "_id" : ObjectId("5b7590cabfd90aa9cc9253aa"),
    "path" : "cc/dd",
    "data" : {
        "c" : "d",
        "path_list":[{"path_ref" : "aa/bb"}]
    }
}


{
    "_id" : ObjectId("5b7590cabfd90aa9cc9253aa"),
    "path" : "ee/ff",
    "data" : {
        "e" : "f",
        "path_list":[{"path_ref" : "aa/cc"}]
    }
}

如果 data.path_ref 存在,我需要将字符串替换为对象(如果字符串是有效路径)。如果没有,什么也不做。所以我想得到:

{
    "_id" : ObjectId("5b759065bfd90aa9cc925349"),
    "path" : "aa/bb",
    "data" : {
      "a" : "b"
    }
}
{
    "_id" : ObjectId("5b7590cabfd90aa9cc9253aa"),
    "path" : "cc/dd",
    "data" : {
        "c" : "d",
        "path_list" : [ {"path_ref" :  {
          "_id" : ObjectId("5b759065bfd90aa9cc925349"),
          "path" : "aa/bb",
          "data" : {
            "a" : "b"
          }
        }  }]
    }
}
{
    "_id" : ObjectId("5b7590cabfd90aa9cc9253aa"),
    "path" : "ee/ff",
    "data" : {
        "e" : "f",
        "path_list":[{"path_ref" : "aa/cc"}]
    }
}

我是 mongodb 的新手。我确实对聚合有所了解。请让我知道这是否可能?

======= 符合stackoverflow 我发布了很多代码并且没有足够的描述。但我想我已经清楚地描述了我的问题。这些只是占位符。请忽略它。

标签: mongodbaggregation-framework

解决方案


您可以在 3.6 中使用以下聚合。

db.col.aggregate([
{"$unwind":{"path":"$data.path_list","preserveNullAndEmptyArrays":true}},
{"$lookup":{
  "from":"col",
  "localField":"data.path_list.path_ref",
  "foreignField":"path",
  "as":"path_ref_lookup"
}},
{"$unwind":{"path":"$path_ref_lookup","preserveNullAndEmptyArrays":true}},
{"$group":{
  "_id":"$_id",
  "path":{"$first":"$path"},
  "data":{"$first":"$data"},
  "path_refs":{
    "$push":{
      "$cond":[
        {"$gt":["$path_ref_lookup",0]},
        {"path_ref":"$path_ref_lookup"},
        "$data.path_list"
      ]
    }
  }
}},
{"$addFields":{
  "data.path_list":{
    "$cond":[{"$eq":["$path_refs",[]]},"$$REMOVE","$path_refs"]
  }
}},
{"$project":{"path_refs":0}}
])

推荐阅读