我在mongoDB中使用聚合方法进行分组,但是当我使用$ group时,它将返回我用来分组的唯一字段。我已经尝试过$ project,但是它也不起作用。我也尝试了$ first,它起作用了,但是结果数据现在采用了不同的格式。这是我想要的回复格式。
{
"_id" : ObjectId("5b814b2852d47e00514d6a09"),
"tags" : [],
"name" : "name here",
"rating" : "123456789"
}
,然后在我的query.response中添加$ group之后,_id的值更改。 (并且$ group仅使用_id,如果我尝试使用其他任何关键字,则会引发累加器错误。请也对此进行解释。)
{
"_id" :"name here" //the value of _id changed to the name field which i used in $group condition
}
我必须删除名称字段中的重复项,而无需更改任何结构和字段。我也将nodeJS和mongoose一起使用,因此请提供适用于它的解决方案。
答案 0 :(得分:5)
您可以使用以下汇总查询。
$$ROOT
保留每个名称的整个文档,然后使用$replaceRoot
保留该文档的顶部。
db.col.aggregate([
{"$group":{"_id":"$name","doc":{"$first":"$$ROOT"}}},
{"$replaceRoot":{"newRoot":"$doc"}}
])
答案 1 :(得分:2)
在任何数据库上对数据进行分组时,这意味着您要在必填字段上执行累加操作,而不会包括在累加操作中的其他字段将以类似方式使用
db.collection.aggregate([{
$group: {
_id: { field1: "", field1: "" },
acc: { $sum: 1 }
}}]
_id对象中的此处将包含您要保留的所有其他字段。
对于您的数据,您可以尝试
db.collection.aggregate([{
$group: {
_id: "$name",
rating: { $first: "$rating" },
tags: { $first: "$tag" },
docid: { $first: "$_id" }
}
},
{
$project: {
_id: "$docid",
name: "$_id",
rating: 1,
tags: 1
}
}])
答案 2 :(得分:1)
您可以使用此查询
db.col.aggregate([
{"$group" : {"_id" : "$name","data" : {"$first" : "$$ROOT"}}},
{"$project" : {
"tags" : "$data.tags",
"name" : "$data.name",
"rating" : "$data.rating",
"_id" : "$data._id"
}
}])
答案 3 :(得分:1)
user2683814的解决方案对我有用,但就我而言,当我们替换newRoot对象时,我有一个计数器累加器,最后一个阶段缺少计数字段,因此我使用了$mergeObjects
运算符来获取我的计数字段回来。
db.collection.aggregate([
{
$group: {
_id: '$product',
detail: { $first: '$$ROOT' },
count: {
$sum: 1,
},
},
},
{
$replaceRoot: {
newRoot: { $mergeObjects: [{ count: '$count' }, '$detail'] },
},
}])
答案 4 :(得分:1)
我想按groupById
字段对集合进行分组,并将其存储为键值为groupById
且键值为该组所有项的键值对。
db.col.aggregate([{$group :{_id :"$groupById",newfieldname:{$push:"$"}}}]).pretty()
这对我来说很好。