鑒于此課程集合,有一個由物件組成的主題串列。是否可以創建一個聚合來創建一個新欄位newSubjects,該欄位通過其 id 映射所有主題?例如,給定此集合如何將subjects條目從:
[
{
_id: ObjectId("623e2f0cb242ee9367eb3c9f"),
subjects: [ { id: '1', name: 'math' }, { id: '2', name: 'physics' } ]
},
{
_id: ObjectId("623e2f17b242ee9367eb3ca0"),
subjects: [ { id: '1', name: 'math' }, { id: '3', name: 'biology' } ]
}
]
進入:
{
newSubjects: { '1': { id: '1', name: 'math' }, '2': { id: '2', name: 'physics' } }
}
{
newSubjects: { '1': { id: '1', name: 'math' }, '3': { id: '3', name: 'biology' } }
}
使用 JavaScript 我可以使用這個運算式:
db.courses.find().forEach(x => print({"newSubjects": Object.fromEntries(new Map(x.subjects.map(s => [s.id, s])))}))
我試圖找出一個聚合來完成這個,但還沒有$addField成功$map。
uj5u.com熱心網友回復:
你可以試試這個查詢:
只需要一個聚合階段即可復合您想要的結果。在這個階段,您可以使用 a$map來迭代每個值并回傳一個新值。這個新的將有k和v領域。
k欄位將是物件鍵 (1, 2, 3...)v欄位將是值欄位(具有 {id:..., name:...} 的物件)
并被包裹$arrayToObject以翻譯k并v轉換為所需的物件。
db.collection.aggregate([
{
"$project": {
"_id": 0,
"newSubjects": {
"$arrayToObject": {
"$map": {
"input": "$$ROOT.subjects",
"in": {
"k": "$$this.id",
"v": {
"id": "$$this.id",
"name": "$$this.name"
}
}
}
}
}
}
}
])
這里的例子
uj5u.com熱心網友回復:
另外一個選擇:
db.collection.aggregate([
{
"$project": {
"newSubjects": {
"$arrayToObject": {
"$map": {
"input": "$subjects",
"as": "s",
"in": {
k: "$$s.id",
v: "$$s"
}
}
}
}
}
}
])
解釋:
使用必要的 k,v 映射陣列,該 k,v 適合于將 arrayToObject 投影為 newSubjects
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/450661.html
