mongodb - mongodb中的父子查询
问题描述
我收集了这些数据:
[
{
_id: "id1",
parentId: null,
text: "text 1"
},
{
_id: "id2",
parentId: null,
text: "text 2"
},
{
_id: "id3",
parentId: null,
text: "text 3"
},
{
_id: "id4",
parentId: "id1",
text: "text 4"
},
{
_id: "id5",
parentId: "id1",
text: "text 5"
},
{
_id: "id6",
parentId: "id2",
text: "text 6"
},
{
_id: "id7",
parentId: "id5",
text: "text 7"
}
]
我希望每个孩子都像这样追随父母:
[
{
_id: "id1",
parentId: null,
text: "text 1"
},
{
_id: "id4",
parentId: "id1",
text: "text 4"
},
{
_id: "id5",
parentId: "id1",
text: "text 5"
},
{
_id: "id7",
parentId: "id5",
text: "text 7"
},
{
_id: "id2",
parentId: null,
text: "text 2"
},
{
_id: "id6",
parentId: "id2",
text: "text 6"
},
{
_id: "id3",
parentId: null,
text: "text 3"
}
]
但我在 mongodb 中没有找到任何查询。那可能吗 ?我将此模式用于商店评论,我需要这样排序。对于 sql 查询,我在 youtube 上找到了这个视频:https ://www.youtube.com/watch?v=yA-YqKBNyNc
解决方案
这是使用聚合框架的解决方案:
db.test.aggregate([{
$addFields: {
parentIdId: {
$concat: [{
$ifNull: [{
$toString: "$parentId"
}, ""]
}, {
$toString: "$_id"
}]
}
}
}, {
$sort: {
parentIdId: 1
}
}, {
$project: {
parentIdId: 0
}
}])
结果 :
{"_id":"id1","parentId":null,"text":"text 1","parentIdId":"id1"}
{"_id":"id4","parentId":"id1","text":"text 4","parentIdId":"id1id4"}
{"_id":"id5","parentId":"id1","text":"text 5","parentIdId":"id1id5"}
{"_id":"id2","parentId":null,"text":"text 2","parentIdId":"id2"}
{"_id":"id6","parentId":"id2","text":"text 6","parentIdId":"id2id6"}
{"_id":"id3","parentId":null,"text":"text 3","parentIdId":"id3"}
{"_id":"id7","parentId":"id5","text":"text 7","parentIdId":"id5id7"}
在这个解决方案中,我在您的查询结果中创建一个新字段,它是 parentId 和 Id 的串联,然后我对其进行排序。
如果你想去掉这个技术领域,你可以添加这个管道阶段:
{$project: {parentIdId: 0}}
您的最终查询将是:
db.test.aggregate([{
$addFields: {
parentIdId: {
$concat: [{
$ifNull: [{
$toString: "$parentId"
}, ""]
}, {
$toString: "$_id"
}]
}
}
}, {
$sort: {
parentIdId: 1
}
}, {
$project: {
parentIdId: 0
}
}])
推荐阅读
- ios - 使用闭包的函数签名在其他类中显示不正确
- git - 如何在给定哈希后枚举添加的文件集到特定目录
- sql - 如何选择过去 7 天内未下订单的客户
- javascript - 如何在 JS 中显示我出生以来的毫秒数?
- android - Android 中的 LiveDataScope 与 ViewModelScope
- azure-active-directory - 如何访问 Azure APIM 策略中的 Active Directory 用户/组?
- python - 有没有办法从单个 pytest 测试用例显式生成多个 pytest 结果?
- elasticsearch - 将 index.highlight.max_analyzed_offset 增加到更大的数字会损害查询性能吗?如果有,多少钱,为什么?
- regex - 如何在不使用 foreach 循环的情况下通过管道处理“Select-String -pattern”返回对象?
- java - 如何按用户输入的扩展名和名称搜索文件?