假設我有一個帶有_idand的以下集合traits。
{
_id: 1,
traits: {
Rarity: {
infoin: 15,
},
Type: {
iron: 3,
sliver: 5,
wood: 7,
},
},
},
{
_id: 2,
traits: {
Cloth: {
barron1: 11,
barron2: 12,
},
Hair: {
black: 6,
yellow: 9,
red: 8
}
},
},
...
如您所見,鍵traits是動態的,子物件的鍵也是如此。
這是我想要得到的結果:
{
_id: 1,
traits: 15,
},
{
_id: 2,
traits: 23
}
小費:
資訊幣 = 鐵 銀 木
barron1 barron2 = 黑色 黃色 紅色
uj5u.com熱心網友回復:
$set-traitObjs通過將物件轉換為陣列來設定陣列欄位$objectToArray。$set- 通過從陣列中獲取第一個檔案的值來設定firstTraitValues欄位,然后通過.traitObjs$objectToArray$project- 裝飾輸出檔案。通過將陣列轉換為具有所有值的數字型別來設定traits欄位。firstTraitValues$reduce$sumv
db.collection.aggregate([
{
$set: {
traitObjs: {
$objectToArray: "$traits"
}
}
},
{
$set: {
firstTraitValues: {
$objectToArray: {
$first: "$traitObjs.v"
}
}
}
},
{
$project: {
traits: {
$reduce: {
input: "$firstTraitValues",
initialValue: 0,
in: {
$sum: [
"$$value",
"$$this.v"
]
}
}
}
}
}
])
示例 Mongo Playground
由于第一個關鍵檔案和第二個關鍵檔案中的所有值traits都相同,
資訊幣 = 鐵 銀 木
barron1 barron2 = 黑色 黃色 紅色
因此,上述方法只是總結了 的第一個關鍵檔案中的所有值traits。
uj5u.com熱心網友回復:
這個答案實際上與@yong-shun 的答案相同,但它將所有內容組合成一個"$project"。不知道會不會更有效率。
db.collection.aggregate([
{
"$project": {
"traits": {
"$reduce": {
"input": {
"$objectToArray": {
"$getField": {
"field": "v",
"input": { "$first": { "$objectToArray": "$traits" } }
}
}
},
"initialValue": 0,
"in": { "$sum": [ "$$value", "$$this.v" ] }
}
}
}
}
])
在mongoplayground.net上試試。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/482939.html
下一篇:PyMongo查詢|如何匯入引數
