MongoDB-将嵌入文档中的行解压到它们自己的列中



问题

所以我有一个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属性很可能是一个数组。

我可以在您的聚合命令中看到三个额外的问题:

  1. 您应该将聚合管道作为数组传递给aggregate函数
  2. CCD_ 10的语法在聚合流水线中是不同的。您没有定义应包括哪些字段。您确实定义了实际映射
  3. 我不明白你为什么要展开winners id。要展开的属性应该是一个数组,而在你的例子中只有winners数组

我认为在投影之前进行$unwind比较容易

db.awards.aggregate(
[
{
$unwind: { path: '$winners' }
},
{
$project: {
year: '$year',
winner_id: '$winners.id'
}
}
]
);

Mongo游乐场

您需要首先$unwindwinners,然后使用$replaceRoot将其获取到ROOT位置

db.collection.aggregate([
{ "$unwind": "$winners" },
{ "$replaceRoot": {
"newRoot": {
"$mergeObjects": [
"$winners",
{ "year": "$year" }
]
}
}
}
])

MongoPlayground

相关内容

  • 没有找到相关文章

最新更新