Запрос группы mongo, как сохранить поля
Все.
В запросе группы 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 } })
результат:
[
{
"name" : "ddl1st",
"count" : 1
},
{
"name" : "24k",
"count" : 1
}
]
Как получить следующее:
[
{
"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
}
]
Ответы
Ответ 1
Если вы хотите сохранить информацию о первых совпадающих записях для каждой группы, попробуйте выполнить агрегирование следующим образом:
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 }
}
}
Ответ 2
Кстати, если вы хотите сохранить не только первый документ, вы можете использовать$ addToSet
Например:
db.test.aggregate({
$group: {
_id: '$name',
name : { $addToSet: '$name' }
age : { $addToSet: '$age' },
count: { $sum: 1 }
}
}
Ответ 3
Я не знал о помощнике .group
, но если вы предпочитаете использовать Aggregation Framework, тогда вам придется укажите, какие поля будут возвращены. Исправьте меня, если я ошибаюсь, но в SQL вам все равно придется это делать.
Ну, вот как вы это сделаете с упомянутой ранее структурой агрегации:
db.test.aggregate({
$group: {
_id: { name: "$name", city: "$city", fieldName: "$fieldName" },
count: { $sum: 1 }
}
})
Ответ 4
Я пришел сюда в поисках ответа, но не был доволен выбранным ответом (особенно учитывая его возраст). Я нашел этот ответ, который является лучшим решением (адаптировано):
db.test.aggregate({
$group: {
_id: '$name',
person: { "$first": "$$ROOT" },
count: { $sum: 1 }
},
{
"$replaceRoot": { "newRoot": "$person" }
}
}
Ответ 5
Вы можете попробовать это
db.test.aggregate({
{ $group:
{ _id: '$name',count: { $sum: 1 }, data: { $push: '$$ROOT' } } },
{
$project: {
_id:0,
data:1,
count :1
}
}
}
Ответ 6
Это то, что я сделал, он отлично работает.
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
}
}])
Ответ 7
Я создал эту функцию, чтобы обобщить обратную стадию раскрутки... дайте мне знать, если вы, ребята, столкнулись с какими-либо ошибками, но она хорошо работает для меня!
const createReverseUnwindStages = unwoundField => {
const stages = [
//
// Group by the unwound field, pushing each unwound value into an array,
//
// Store the data from the first unwound document
// (which should all be the same apart from the unwound field)
// on a field called data.
// This is important, since otherwise we have to specify every field we want to keep individually.
//
{
$group: {
_id: '$_id',
data: {$first: '$$ROOT'},
[unwoundField]: {$push: '$${unwoundField}'},
},
},
//
// Copy the array of unwound fields resulting from the group into the data object,
// overwriting the singular unwound value
//
{
$addFields: {['data.${unwoundField}']: '$${unwoundField}'},
},
//
// Replace the root with our data object
//
{
$replaceRoot: {
newRoot: '$data',
},
},
]
return stages
}
Ответ 8
Вот ответ → →
$m = new \MongoDB\Driver\Manager();
$command = new \MongoDB\Driver\Command([
'aggregate' => 'mytestusers',
'pipeline' => [
['$match' => ['name' => 'Pankaj Choudhary']],
['$unwind'=>'$skills'],
['$lookup' => array('from'=>'mytestskills','localField'=>'skills','foreignField'=>'_id','as'=>'sdfg')],
['$unwind'=>'$sdfg'],
['$group'=>array('_id'=>array('_id'=>'$_id','name'=>'$name','email'=>'$email'),'skills'=>array('$push'=>'$skills'),'sdfg'=>array('$push'=>'$sdfg'))],
],
'cursor' => new \stdClass,
]);
$cursor = $m->executeCommand('targetjob-plus', $command);
$result = $cursor->toArray();