【发布时间】:2017-08-08 20:09:17
【问题描述】:
我有一个推文集合,我正在尝试将根级别的转推(与引用的推文类似)输出到一个新集合,以便稍后使用转储和恢复将它们与原始集合合并)。 转推状态是推文文档中的一个子文档,可能有多条推文转发同一条推文。 如何在根级别进行转发并添加一个名为“retweeted_by”的数组,其中包含转发它的所有推文的 ID?
请记住,我使用推文 ID 作为主索引 (_id) 以避免在组合 (mongorestore) 集合时创建重复项。
我的收藏有以下形式:
{
"_id" : "123456",
"other_fields1" : "values1",
"retweeted_status" : {
"retweet_id": "159753",
"other_fields2" : "values2",
}
}
理想的输出应该是这样的:
{
"_id" : "159753",
"other_fields2" : "values2",
"retweeted_by" : [ "123456", "974631", "121212"]
}
编辑澄清:
子文档中的字段 (other_fields2) 是多个字段 (~28),并非所有其他推文中都存在
【问题讨论】:
-
db.collection.aggregate([{$group: {_id: "$retweeted_status.retweet_id", retweeted_by: {$push: "$_id"}}}]) -
@felix 谢谢,但这仅输出 retweeted_status 的 id,而不是 retweeted_status 的整个子文档,在我的示例“other_fields2”中调用...我认为分组后我需要使用 $replaceRoot将子文档作为 newRoot 并以某种方式添加数组 retweeted_by
-
添加
other_fields2: {$first: "$retweeted_status.other_fields2"}。请看mongodb documentation $group -
@felix 我试过了,但问题是 other_fields2 实际上是多个字段(在 24-28 个字段之间),从一个转发到另一个不同,即一个可以有 24 个字段,另一个可以有一个额外 4 个字段
-
@felix 我想我找到了解决问题的方法。我刚开始在这里提问,那么最好的方法是什么:我应该发布解决方案还是删除问题?
标签: mongodb aggregation-framework