将字段保持在 mongodb 组中
Keeping field in mongodb group by
我在 mongo db
的集合中有以下类型的文档
{ _id:xx,
iddoc:yy,
type1:"sometype1",
type2:"sometype2",
date:
{
year:2015,
month:4,
day:29,
type:"day"
},
count:23 }
我想对所有文档按 iddoc 分组的字段计数求和,其中:
type1 in ["type1A","type1B",...] where type2 in
["type2A","type2B",...] date.year: 2015, date.month: 4, date.type:
"day" date.day between 4 and 7
然后我想对这些总和进行排序。
我现在知道怎么做了(参见 )
db.test.aggregate([
// Filter the docs based on your criteria
{$match: {
type1: {$in: ['type1A', 'type1B']},
type2: {$in: ['type2A', 'type2B']},
'date.year': 2015,
'date.month': 4,
'date.type': 'day',
'date.day': {$gte: 4, $lte: 7}
}},
// Group by iddoc and count them
{$group: {
_id: '$iddoc',
sum: {$sum: 1}
}},
// Sort by sum, descending
{$sort: {sum: -1}}
])
但希望匹配操作中的某些字段出现在最终文档中。这可能吗?怎么样?
我相信这个查询可以解决您的问题:
db.test.aggregate([
// Filter the docs based on your criteria
{$match: {
type1: {$in: ['type1A', 'type1B']},
type2: {$in: ['type2A', 'type2B']},
'date.year': 2015,
'date.month': 4,
'date.type': 'day',
'date.day': {$gte: 4, $lte: 7}
}},
// Group by iddoc and type1 and count them
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
type2: { $push: '$type2' },
year: { $first: '$date.year' },
month: { $first: '$date.month' },
day: { $addToSet: '$date.day' }
}},
// Sort by sum, descending
{$sort: {sum: -1}}
])
您可以选择如何查看其余字段。我选择将 type2 推送到一个数组(允许重复),取第一个值 year
和 month
因为它们总是 2015 和 4 每个你的匹配操作,和 addToSet
数组的日期(不允许重复)。
另一种选择是将整个文档放入匹配数组中,但在大型集合中应该小心。
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
matches: { $push: '$$ROOT' }
}},
我在 mongo db
的集合中有以下类型的文档{ _id:xx,
iddoc:yy, type1:"sometype1", type2:"sometype2", date: { year:2015, month:4, day:29, type:"day" }, count:23 }
我想对所有文档按 iddoc 分组的字段计数求和,其中:
type1 in ["type1A","type1B",...] where type2 in ["type2A","type2B",...] date.year: 2015, date.month: 4, date.type: "day" date.day between 4 and 7
然后我想对这些总和进行排序。
我现在知道怎么做了(参见
db.test.aggregate([
// Filter the docs based on your criteria
{$match: {
type1: {$in: ['type1A', 'type1B']},
type2: {$in: ['type2A', 'type2B']},
'date.year': 2015,
'date.month': 4,
'date.type': 'day',
'date.day': {$gte: 4, $lte: 7}
}},
// Group by iddoc and count them
{$group: {
_id: '$iddoc',
sum: {$sum: 1}
}},
// Sort by sum, descending
{$sort: {sum: -1}}
])
但希望匹配操作中的某些字段出现在最终文档中。这可能吗?怎么样?
我相信这个查询可以解决您的问题:
db.test.aggregate([
// Filter the docs based on your criteria
{$match: {
type1: {$in: ['type1A', 'type1B']},
type2: {$in: ['type2A', 'type2B']},
'date.year': 2015,
'date.month': 4,
'date.type': 'day',
'date.day': {$gte: 4, $lte: 7}
}},
// Group by iddoc and type1 and count them
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
type2: { $push: '$type2' },
year: { $first: '$date.year' },
month: { $first: '$date.month' },
day: { $addToSet: '$date.day' }
}},
// Sort by sum, descending
{$sort: {sum: -1}}
])
您可以选择如何查看其余字段。我选择将 type2 推送到一个数组(允许重复),取第一个值 year
和 month
因为它们总是 2015 和 4 每个你的匹配操作,和 addToSet
数组的日期(不允许重复)。
另一种选择是将整个文档放入匹配数组中,但在大型集合中应该小心。
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
matches: { $push: '$$ROOT' }
}},