it-swarm.com.de

Mongo-Gruppe Abfrage, wie Felder zu halten

Jeder. In der Mongo-Gruppenabfrage werden im Ergebnis nur die Schlüssel in Argumenten angezeigt. So behalten Sie das erste Dokument in jeder Gruppe wie bei einer MySQL-Abfragegruppe. beispielsweise:

-------------------------------------------------------------------------
|  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 } })

ergebnis:

[
{
    "name" : "ddl1st",
    "count" : 1
},
{
    "name" : "24k",
    "count" : 1
}
]

So erhalten Sie Folgendes:

[
   {
   "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
}
]
66
plusor

Wenn Sie die Informationen zu den ersten übereinstimmenden Einträgen für jede Gruppe behalten möchten, können Sie versuchen, wie folgt zu aggregieren:

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 }
  }
}
166
MervS

Übrigens, wenn Sie nicht nur das erste Dokument behalten möchten, können Sie $ addToSet verwenden. Zum Beispiel:

db.test.aggregate({
  $group: {
    _id: '$name',
    name : { $addToSet: '$name' }
    age : { $addToSet: '$age' },
    count: { $sum: 1 }
  }
}
3
陈学铄

Ich wusste nicht über .group helper, aber wenn Sie das Aggregation Framework bevorzugen, müssen Sie angeben, welche Felder zurückgegeben werden sollen. Korrigieren Sie mich, wenn ich falsch liege, aber in SQL müssten Sie das trotzdem tun.

Nun, so würden Sie es mit dem zuvor erwähnten Aggregation Framework machen:

db.test.aggregate({
  $group: {
    _id: { name: "$name", city: "$city", fieldName: "$fieldName" },
    count: { $sum: 1 }
  }
})
1
gustavohenke

Sie können dies ausprobieren

db.test.aggregate({
      { $group: 
            { _id: '$name',count: { $sum: 1 }, data: { $Push: '$$ROOT' } } },
      {
        $project: {
          _id:0,
          data:1,
          count :1
        }
      }

}
0
Deeksha Sharma

Dies ist, was ich getan habe, es funktioniert gut.

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 
  }
}])

Ich bin hierher gekommen, um eine Antwort zu suchen, war aber mit der ausgewählten Antwort nicht zufrieden (besonders angesichts des Alters). Ich fand diese Antwort das ist eine bessere Lösung (angepasst):

db.test.aggregate({
  $group: {
    _id: '$name',
   person: { "$first": "$$ROOT" },
   count: { $sum: 1 }
  },
  {
    "$replaceRoot": { "newRoot": "$person" }
  }
}
0
Pieter