每个人.在mongo组查询中,结果仅显示参数中的键.如何将每个组中的第一个文档保存为mysql查询组.例如:
-------------------------------------------------------------------------
| name | age | sex | province | city | area | address |
-------------------------------------------------------------------------
| ddl1st | 22 | ??? | BeiJing | BeiJing | ChaoYang | QingNianLu |
| ddl1st | 24 | ??? | BeiJing | BeiJing | XuHui | ZhaoJiaBangLu |
| 24k | 220 | ... | .... | ... | ... | ... |
-------------------------------------------------------------------------
db.users.group({key: { name: 1},reduce: function ( curr, result ) { result.count ++ },initial: {count : 0 } })
Run Code Online (Sandbox Code Playgroud)
结果:
[
{
"name" : "ddl1st",
"count" : 1
},
{
"name" : "24k",
"count" : 1
}
]
Run Code Online (Sandbox Code Playgroud)
如何获得以下内容:
[
{
"name" : "ddl1st",
"age" : 22,
"sex" : "???",
"province" : "BeiJing",
"city" : "BeiJing",
"area" : "ChaoYang",
"address" : "QingNianLu",
"count" : 1
},
{
"name" : "24k",
"age" : 220,
"sex" : "...",
"province" : "...",
"city" : "...",
"area" : "...",
"address" : "...",
"count" : 1
}
]
Run Code Online (Sandbox Code Playgroud)
Mer*_*rvS 181
如果要保留每个组的第一个匹配条目的信息,可以尝试聚合,如:
db.test.aggregate({
$group: {
_id: '$name',
name : { $first: '$name' }
age : { $first: '$age' },
sex : { $first: '$sex' },
province : { $first: '$province' },
city : { $first: '$city' },
area : { $first: '$area' },
address : { $first: '$address' },
count: { $sum: 1 }
}
}
Run Code Online (Sandbox Code Playgroud)
Pie*_*ter 25
[编辑以包含评论建议]
我来到这里寻找答案,但对所选答案不满意(特别是考虑到它的年龄)。我发现这个答案是一个更好的解决方案(改编):
db.test.aggregate({
$group: {
_id: '$name',
person: { "$first": "$$ROOT" },
count: { $sum: 1 }
},
{
"$replaceRoot": { "newRoot": { "$mergeObjects": ["$person", { count: "$count" }]} }
}
}
Run Code Online (Sandbox Code Playgroud)
Dee*_*rma 11
你可以试试这个
db.test.aggregate({
{ $group:
{ _id: '$name',count: { $sum: 1 }, data: { $push: '$$ROOT' } } },
{
$project: {
_id:0,
data:1,
count :1
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
顺便说一句,如果您不仅要保留第一个文档,还可以使用$ addToSet 例如:
db.test.aggregate({
$group: {
_id: '$name',
name : { $addToSet: '$name' }
age : { $addToSet: '$age' },
count: { $sum: 1 }
}
}
Run Code Online (Sandbox Code Playgroud)
使用$first
与$$ROOT
文档,然后用$replaceRoot
与第一场。
db.test.aggregate([
{ "$group": {
"_id": "$name",
"doc": { "$first": "$$ROOT" }
}},
{ "$replaceRoot": { "newRoot": "$doc" }}
])
Run Code Online (Sandbox Code Playgroud)
这就是我所做的,它工作正常。
db.person.aggregate([
{
$group: { _id: '$name'}, // pass the set of field to be grouped
age : { $first: '$age' }, // retain remaining field
count: { $sum: 1 } // count based on your group
},
{
$project:{
name:"$_id.name",
age: "$age",
count: "$count",
_id:0
}
}])
Run Code Online (Sandbox Code Playgroud)
小智 5
如果您在处理包含多个字段的文档时遇到同样的问题,只需快速更新即可。可以使用组合$replaceRoot
流水线阶段和$mergeObjects
流水线操作符的力量。
db.users.aggregate([
{
$group: {
_id: '$name',
user: { $first: '$$ROOT' },
count: { $sum: 1 }
},
},
{
$replaceRoot: {
newRoot: { $mergeObjects: [{ count: '$count' }, '$user'] }
}
}
])
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
49914 次 |
最近记录: |