我有一個聚合查詢,我在其中根據許多欄位進行分組。我想從 中獲取所有屬性_id并將它們放在頂級物件上。最好的方法是什么?我創建了一個顯示問題的簡化版本的操場:
https://mongoplayground.net/p/BjZKXYkH9Jb
我可以通過將每個_id值重復為 中的欄位$group并使用$project洗掉_id. 有沒有更好的方法來獲得相同的結果而不需要兩次列出每個欄位?我在_id.
下面是一個例子:
資料:
[
{
"name": "Adam",
"country": "Argentina",
"colour": "Red"
},
{
"name": "Betty",
"country": "Belgium",
"colour": "Blue"
},
{
"name": "Clive",
"country": "Argentina",
"colour": "Red"
},
{
"name": "Daniel",
"country": "Argentina",
"colour": "Blue"
},
{
"name": "Edna",
"country": "Belgium",
"colour": "Blue"
}
]
詢問:
db.collection.aggregate([
{
"$group": {
_id: {
"country": "$country",
"colour": "$colour"
},
"names": {
"$push": "$name"
},
"country": {
"$first": "$country"
},
"colour": {
"$first": "$colour"
}
}
},
{
"$project": {
"_id": 0,
"country": 1,
"colour": 1,
"names": 1
}
}
])
結果:
[
{
"colour": "Blue",
"country": "Belgium",
"names": [
"Betty",
"Edna"
]
},
{
"colour": "Red",
"country": "Argentina",
"names": [
"Adam",
"Clive"
]
},
{
"colour": "Blue",
"country": "Argentina",
"names": [
"Daniel"
]
}
]
uj5u.com熱心網友回復:
您可以_id在$project階段中通過點符號訪問屬性,
db.collection.aggregate([
{
"$group": {
_id: {
"country": "$country",
"colour": "$colour"
},
"names": { "$push": "$name" }
}
},
{
$project: {
_id: 0,
country: "$_id.country",
colour: "$_id.colour",
names: 1
}
}
])
操場
第二個選項,如果不想手動合并,嘗試合并操作,
$mergeObjects將_id物件與必填欄位合并$replaceRoot替換物件根
db.collection.aggregate([
{
"$group": {
_id: {
"country": "$country",
"colour": "$colour"
},
"names": { "$push": "$name" }
}
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: ["$_id", { names: "$names" }]
}
}
}
])
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359642.html
標籤:MongoDB
上一篇:$and操作語法
下一篇:聚合函式不添加新列MongoDB
