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