我正在努力實作對基于注釋嵌套模式的嵌套回應。我使用檔案父欄位將子評論(回復)分配給父檔案。
我還需要進行內部查找以獲取也存盤在檔案中的用戶資料(這是我的挑戰)
備注檔案:
{
"_id" : ObjectId("629e0a84e0229e4fba0de395"),
"order" : ObjectId("6298b2a563edd8c9cfa47ba2"),
"notes" : "Aut pariatur Volupt",
"createdBy" : ObjectId("61c2abdff3edde4ab0074ca9"),
}
{
"_id" : ObjectId("629ea872a89b4d1464451307"),
"order" : ObjectId("6298b2a563edd8c9cfa47ba2"),
"notes" : "dewdewdwe",
"createdBy" : ObjectId("61c2abdff3edde4ab0074ca9"),
}
{
"_id" : ObjectId("629f578460c133c4aab8c028"),
"order" : ObjectId("6298b2a563edd8c9cfa47ba2"),
"notes" : "dewdwe",
"createdBy" : ObjectId("61c2abdff3edde4ab0074ca9"),
}
{
"_id" : ObjectId("62a000865f24e1887dfd169e"),
"order" : ObjectId("6298b2a563edd8c9cfa47ba2"),
"noteParent" : ObjectId("629e0a84e0229e4fba0de395"),
"notes" : "Yes this one is ok",
"createdBy" : ObjectId("619e13eeabdf5bf20384b74a"),
}
{
"_id" : ObjectId("62a004d1a3c340725d0c732b"),
"order" : ObjectId("6298b2a563edd8c9cfa47ba2"),
"noteParent" : ObjectId("629e0a84e0229e4fba0de395"),
"notes" : "this one too",
"createdBy" : ObjectId("619e13eeabdf5bf20384b74a"),
}
noteParent是其他檔案 createdBy 的子檔案, 需要查找users集合
通過以下聚合,我得到了正確的嵌套檔案。
db.getCollection("ordernotes").aggregate(
[
{
"$lookup" : {
"from" : "users",
"localField" : "createdBy",
"foreignField" : "_id",
"as" : "createdBy"
}
},
{
"$lookup" : {
"from" : "ordernotes",
"localField" : "_id",
"foreignField" : "noteParent",
"as" : "replies"
}
},
{
"$project" : {
"order" : 1.0,
"notes" : 1.0,
"status" : 1.0,
"replies" : 1.0,
"createdByModel" : 1.0,
"createdBy.firstName" : 1.0,
"createdBy.lastName" : 1.0,
"createdBy.email" : 1.0,
}
}
],
);
但是,如何在replies.createdBy上進行另一次查找而不覆寫回復嵌套檔案
{
"_id" : ObjectId("629e0a84e0229e4fba0de395"),
"order" : ObjectId("6298b2a563edd8c9cfa47ba2"),
"notes" : "Aut pariatur Volupt",
"status" : "pending",
"createdBy" : [
{
"firstName" : "Jim",
"lastName" : "Jones",
"email" : "[email protected]",
}
],
"replies" : [
{
"_id" : ObjectId("62a000865f24e1887dfd169e"),
"order" : ObjectId("6298b2a563edd8c9cfa47ba2"),
"noteParent" : ObjectId("629e0a84e0229e4fba0de395"),
"notes" : "Yes this one is ok",
"createdBy" : ObjectId("619e13eeabdf5bf20384b74a"),
},
{
"_id" : ObjectId("62a004d1a3c340725d0c732b"),
"order" : ObjectId("6298b2a563edd8c9cfa47ba2"),
"noteParent" : ObjectId("629e0a84e0229e4fba0de395"),
"notes" : "this one too",
"createdBy" : ObjectId("619e13eeabdf5bf20384b74b"),
}
]
}
預期輸出:
"_id" : ObjectId("629e0a84e0229e4fba0de395"),
"order" : ObjectId("6298b2a563edd8c9cfa47ba2"),
"notes" : "Aut pariatur Volupt",
"status" : "pending",
"createdBy" : [
{
"firstName" : "Jim",
"lastName" : "Jones",
"email" : "[email protected]",
}
],
"replies" : [
{
"_id" : ObjectId("62a000865f24e1887dfd169e"),
"order" : ObjectId("6298b2a563edd8c9cfa47ba2"),
"noteParent" : ObjectId("629e0a84e0229e4fba0de395"),
"notes" : "Yes this one is ok",
"createdBy" : [
{
"firstName" : "Jane",
"lastName" : "Doe",
"email" : "[email protected]",
}
]
},
{
"_id" : ObjectId("62a004d1a3c340725d0c732b"),
"order" : ObjectId("6298b2a563edd8c9cfa47ba2"),
"noteParent" : ObjectId("629e0a84e0229e4fba0de395"),
"notes" : "this one too",
"createdBy" : [
{
"firstName" : "Bob",
"lastName" : "Carr",
"email" : "[email protected]",
}
] ,
}
]
}
uj5u.com熱心網友回復:
如果我理解正確,你想要這樣的東西:
$lookup進入一個新陣列repliesNotes$map將每個物件replies與其匹配的物件合并repliesNotes
db.notes.aggregate([
{
$lookup: {
from: "users",
localField: "replies.createdBy",
foreignField: "_id",
as: "repliesNotes"
}
},
{
$set: {
replies: {
$map: {
input: "$replies",
in: {
$mergeObjects: [
"$$this",
{
createdBy: {
$arrayElemAt: [
"$repliesNotes",
{$indexOfArray: ["$repliesNotes._id", "$$this.id"]}
]
}
}
]
}
}
},
repliesNotes: "$$REMOVE"
}
}
])
看看它在操場上的例子是如何作業的
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/490189.html
上一篇:在模板內渲染資料庫檔案,EJS
下一篇:如何在反應中連接mongoDB
