如何使用聚合函数mongodb转换数据

如何使用聚合函数mongodb转换数据,mongodb,Mongodb,如何在self-join中基于父对象id转换数据库?这是否可能使结果达到预期。请帮忙,谢谢 db={ post: [ { "_id": ObjectId("59f9c5629f75813e21a6fe34"), "parent_id": "0", "name": "main_category", "short

如何在self-join中基于父对象id转换数据库?这是否可能使结果达到预期。请帮忙,谢谢

db={
  post: [
    {
      "_id": ObjectId("59f9c5629f75813e21a6fe34"),
      "parent_id": "0",
      "name": "main_category",
      "short_desc": "",
      "long_desc": "",
      "slug": "main_category",
      "status": true,
      "createdAt": ISODate("2017-11-01T13:00:18.714Z"),
      "updatedAt": ISODate("2019-02-19T07:31:20.967Z")
    },
    {
      "_id": ObjectId("59f9c5629f75813e21a6fe73"),
      "parent_id": "59f9c5629f75813e21a6fe34",
      "name": "sub_category",
      "short_desc": "",
      "long_desc": "",
      "slug": "sub_category",
      "status": true,
      "createdAt": ISODate("2017-11-01T13:00:18.714Z"),
      "updatedAt": ISODate("2019-02-19T07:31:20.967Z")
    },
    {
      "_id": ObjectId("59f9c5629f75813e21a6fe33"),
      "parent_id": "59f9c5629f75813e21a6fe73",
      "name": "sub_category1",
      "short_desc": "",
      "long_desc": "",
      "slug": "sub_category1",
      "status": true,
      "createdAt": ISODate("2017-11-01T13:00:18.714Z"),
      "updatedAt": ISODate("2019-02-19T07:31:20.967Z")
    }
  ]
}
输出应该是这样的。如果任何其他类别不属于任何内容,则应保持空白

[
  {
    mainCategory: 'main_category',
    subCategory1: 'sub_category',
    subCategory2: 'sub_category1',
    subCategory3: '',
    subCategory4: '',
    subCategory5: ''
  }, {
    mainCategory: '{if any}',
    subCategory1: '{if any}',
    subCategory2: '{if any}',
    subCategory3: '',
    subCategory4: '',
    subCategory5: ''
  }
];

希望获得此统计数据吗?

从其
from
参数指定的集合中读取,而不是从管道中的文档中读取

在为更改数据类型而创建的管道中,使用阶段更新现有文档:

db.post.aggregate([
  {$addFields: {
      parent_oid: {
        $cond: {
          if: {$eq: ["$parent_id","0"]},
          then: "$parent_id",
          else: {$toObjectId: "$parent_id"}
        }
      }
    }
  },
  {$merge: "post"}
])
然后,您可以使用
$graphLookup
形成列表,并将其转换为所需的形状:

db.post.aggregate([
  {$match: {parent_id: "0" }},
  {"$graphLookup": {
      "from": "post",
      "startWith": "$_id",
      "connectFromField": "_id",
      "connectToField": "parent_oid",
      "as": "response"
  }},
  {$unwind: "$response"},
  {$group: {
      _id: "$_id",
      main_category: {$first: "$slug"},
      subCategories: {$push: {
                              k: "$response.name",
                              v: "$response.slug"
      }}
    }
  },
  {$replaceRoot: {
      newRoot: {
        $mergeObjects: [
          {mainCategory: "$main_category"},
          {$arrayToObject: "$subCategories"}
        ]
      }
  }}
])
样本数据的输出:

[
  {
    "mainCategory": "main_category",
    "sub_category": "sub_category",
    "sub_category1": "sub_category1"
  }
]

从其
from
参数指定的集合中读取,而不是从管道中的文档中读取

在为更改数据类型而创建的管道中,使用阶段更新现有文档:

db.post.aggregate([
  {$addFields: {
      parent_oid: {
        $cond: {
          if: {$eq: ["$parent_id","0"]},
          then: "$parent_id",
          else: {$toObjectId: "$parent_id"}
        }
      }
    }
  },
  {$merge: "post"}
])
然后,您可以使用
$graphLookup
形成列表,并将其转换为所需的形状:

db.post.aggregate([
  {$match: {parent_id: "0" }},
  {"$graphLookup": {
      "from": "post",
      "startWith": "$_id",
      "connectFromField": "_id",
      "connectToField": "parent_oid",
      "as": "response"
  }},
  {$unwind: "$response"},
  {$group: {
      _id: "$_id",
      main_category: {$first: "$slug"},
      subCategories: {$push: {
                              k: "$response.name",
                              v: "$response.slug"
      }}
    }
  },
  {$replaceRoot: {
      newRoot: {
        $mergeObjects: [
          {mainCategory: "$main_category"},
          {$arrayToObject: "$subCategories"}
        ]
      }
  }}
])
样本数据的输出:

[
  {
    "mainCategory": "main_category",
    "sub_category": "sub_category",
    "sub_category1": "sub_category1"
  }
]

看一看你能帮我做一个mongoplayground吗?我的尝试是可能需要更改模式,以便
\u id
父id
是相同的数据类型。你想让我知道如何解决这个问题吗?看一看你能帮我做一个mongoplayground吗?我的尝试是可能需要一个模式更改以使
\u id
父级\u id
是相同的数据类型。您想让我了解这一点吗?如何解决?太棒了!但是,如果我添加了另一个父类id为0的新类别,那么聚合将取决于您是否更新文档,使其具有父类id的ObjectId形式。如前所述,它不会返回任何没有子类别的“主”类别,但是您可以使用
preserverNullAndEmptyArrays
选项和
$unwind
阶段,以及
$cond
仅在数组不为空的情况下运行
$arrayToObject
来获得结果。很抱歉,我是mongo的新手,我得到了这个错误:[{“maincegory”:“main_category”,“sub_category”:“子类别”、“子类别1”:“子类别1”},{“主类别”:“主类别”、“子类别”:“子类别”、“子类别1”:“子类别1”},{“新类别”:“新类别”}]对您的条件进行了一些调整,还请注意,此聚合假定您已经更新了所有文档,使其具有一个
parent\u oid
字段,该字段是从
parent\u id
字符串创建的ObjectId。太棒了!但是如果我添加了另一个parent\u id为0的新类别,该聚合取决于您是否更新文档要具有父级id的ObjectId形式。如前所述,它不会返回没有任何子类别的任何“主”类别,但您可以通过使用带有
$unwind
阶段的
$cond
选项和
$cond
仅在e数组不是空的。很抱歉我是mongo的新手,我得到了错误:[{“mainCategory”:“main_category”,“sub_category”:“sub_category”,“sub_category 1”:“sub_category 1”},{“mainCategory”:“main_category”,“sub_category”:“sub_category”,“sub_category 1”:“sub_category 1”},{“new_category”:“new_category”}]对您的条件进行了一些调整,还请注意,此聚合假定您已经更新了所有文档,使其具有一个
parent\u oid
字段,该字段是从
parent\u id
字符串创建的ObjectId。