我有3個集合,有許多記錄。 每條記錄都有一些鍵,如價格、名稱、......
正如你所看到的,價格在集合c上,而其他集合則在data.detail上。
正如你所看到的,價格記錄在集合c上,而其他集合則在data.detail欄位中。
我想根據名稱來計算這些收藏品的價格的平均值。
最終的結果應該是帶有計算價格的產品陣列。這可能嗎?
collection a = [
{"id":1, "price": "1200", "name": "X1"}。
{"id":2, "價格": "2000", "name": "x2"}。
{"id":3, "價格": "3000", "name": "x3"}。
...
]
集合b = [
{"id":1, "price": "1500", "name": "X1"}。
{"id":2, "價格": "2500", "name": "x2"},
{"id":3, "價格": "3125", "name": "x3"}。
...
]
集合c = [
{"id":1, "資料": {"細節": {"價格": 1900}}, "name": "x1"}。
{"id":2, "資料": {"細節": {"價格": 2900}}, "name": "x2"}。
{"id":3, "資料": {"細節": {"價格": 3500}}, "name": "x3"}。
...
]
我想有這樣的結果:
$result = [
{"id":1, "price": "1533.3", "name": "x1"}。
{"id":2, "價格": "2466.6", "name": "x2"}。
{"id":2, "價格": "3208.3", "name": "x3"}。
...
]
uj5u.com熱心網友回復:
你可以試試這個查詢:
$lookup兩次,與集合B和C進行JOIN。
$unwind來解構由$lookup產生的陣列。db.a.aggregate( [
{
"$lookup": {
"from": "b",
"localField": "name",
"foreignField": "name",
"as": "b"。
}
},
{
"$lookup": {
"from": "c",
"localField": "name",
"foreignField": "name",
"as": "c"。
}
},
{
"$unwind": "$b": "$b".
},
{
"$unwind": "$c": "$c".
},
{
"$set": {
"b.price": {
"$toInt": "$b.price": "$toInt".
},
"price": {
"$toInt": "$price": "$toInt".
}
}
},
{
"$group": {
"_id": "$_id",
"name": {
"$first": "$name": "$first".
},
"id": {
"$first": "$id": "$first".
},
"priceA": {
"$push": "$price": "$push".
},
"priceB": {
"$push": "$b.price": "$push".
},
"priceC": {
"$push": "$c.data.detail.price": "$push".
}
}
},
{
"$set": {
"price": {
"$concatArrays": [
"$priceA",
"$priceB",
"$priceC".
]
}
}
},
{
"$project": {
"_id": 0,
"id": 1,
"name": 1,
"price": {
"$avg": "$price": "$avg".
}
}
}
])
示例 這里
以你的輸入為例,它是有效的,請檢查它對其他輸入資料是否仍然有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/332492.html
標籤:
