问题
所以我有一个MongoDB文档,看起来是这样的:
Awards
:
[
{
"year": "2017",
"winners": [
{
"name": "james",
"id": 1
},
{
"name": "adam",
"id": 2
}
]
},
{
"year": "2018",
"winners": [
{
"name": "mary",
"id": 3
},
{
"name": "jane",
"id": 4
}
]
}
]
我基本上是想扩大每年的获奖者,这样模式大致为(year, winner_id)
,我以后可以将其用于我计划进行的加入。类似这样的东西:
[
{
"year":"2017",
"winner_id":1
},
{
"year":"2017",
"winner_id":2
},
{
"year":"2018",
"winner_id":3
},
{
"year":"2018",
"winner_id":4
}
]
我尝试过的
凭直觉,我正在寻找类似$unwind
的东西,但问题是winners
不是一个数组。
我尝试了
db.awards.aggregate({'$unwind':'$winners.id'})
,但没有成功。(给出空结果(所以后来我想到了
db.awards.aggregate({'$unwind': {'$objectToArray':'$winners.id'}})
,但也没用。(出现错误(根据这篇帖子,我应该这样做:
db.awards.aggregate(
{ '$project': {
_id: 1,
'winners': 1
} },
{'$unwind': '$winners'},
{'$unwind': '$winners.id'}
)
但即使这样也不起作用,我仍然得到了每个winner
的嵌入文档
有什么想法吗?
您的数据是无效的JSON。假设winners
属性很可能是一个数组。
我可以在您的聚合命令中看到三个额外的问题:
- 您应该将聚合管道作为数组传递给
aggregate
函数 - CCD_ 10的语法在聚合流水线中是不同的。您没有定义应包括哪些字段。您确实定义了实际映射
- 我不明白你为什么要展开winners id。要展开的属性应该是一个数组,而在你的例子中只有
winners
数组
我认为在投影之前进行$unwind
比较容易
db.awards.aggregate(
[
{
$unwind: { path: '$winners' }
},
{
$project: {
year: '$year',
winner_id: '$winners.id'
}
}
]
);
Mongo游乐场
您需要首先$unwind
winners
,然后使用$replaceRoot
将其获取到ROOT位置
db.collection.aggregate([
{ "$unwind": "$winners" },
{ "$replaceRoot": {
"newRoot": {
"$mergeObjects": [
"$winners",
{ "year": "$year" }
]
}
}
}
])
MongoPlayground