使用MongoDB进行分组,同时保留所有键和值

时间:2016-04-13 10:12:49

标签: mongodb mongodb-query

我正在尝试使用MongoDB运行查询,但我似乎无法弄明白。我有两个刮刀同时从不同的API收集数据,并将它们插入不同文档中的相同集合中。如果我的藏品中有以下文件:

{
'scraper': 1,
'time': 24,
'number: 500
}

{
'scraper': 2,
'time': 24,
'number: 600
}

{
'scraper': 1,
'time': 12,
'number: 700
} 

{
'scraper': 2,
'time': 12,
'number: 800
}

在查询之后,我想基于时间比较数据(以及组),但是将刮刀ID和两个文档的数量保持在一起。

{
'time': 24,
'data':[
    {'scraper':1, 'number:500},
    {'scraper':2, 'number':600}]
}

{
'time': 12,
'data':[
    {'scraper':1, 'number:700},
    {'scraper':2, 'number':800}]
}

我会把我的尝试联系起来,但我太过分了。我想我需要以某种方式使用.aggregate和分组,但我似乎无法弄清楚如何保存两个文档中的数据并重新排列它。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您使用聚合组进入正确的轨道,$ addToSet将保留原始唯一值,或者如果您想保留重复项,则可以使用$ push:

addToSet:

db.groups.aggregate([
    {$group: {_id: '$time', data: {$addToSet: {scraper: '$scraper', number: '$number' }}}}
])

推:

db.groups.aggregate([
    {$group: {_id: '$time', data: {$push: {scraper: '$scraper', number: '$number' }}}}
])

(两者都会为您提供的数据集提供相同的结果)

如果保留字段名称,' time'而不是_id对您来说很重要,您可以添加一个额外的项目阶段。

db.groups.aggregate([
    {$group: {_id: '$time', data: {$push: {scraper: '$scraper', number: '$number' }}}},
    {$project: {_id: 0, time: '$_id', data: 1}}
])