как сгруппировать в mongoDB и вернуть все поля в результат - PullRequest
0 голосов
/ 29 сентября 2018

Я использую метод агрегирования в mongoDB для группировки, но когда я использую $ group, он возвращает единственное поле, которое я использовал для группировки.Я пробовал $ проект, но он тоже не работает.Я также сначала попытался $, и это сработало, но теперь результаты в другом формате.это формат ответа, который я хочу.

{ "_id" : ObjectId("5b814b2852d47e00514d6a09"), "tags" : [], "name" : "name here", "rating" : "123456789" }

и после добавления $ group в мой query.response примерно так, значение _id изменяется.(и $ group берет только _id, если я пытаюсь использовать любое другое ключевое слово, оно выдает ошибку аккумулятора. Пожалуйста, объясните это также.)

{
    "_id" :"name here" //the value of _id changed to the name field which i used in $group condition

}

я должен удалитьдубликаты в поле имени, без изменения какой-либо структуры и полей.также я использую nodeJS с mongoose, поэтому, пожалуйста, предоставьте решение, которое работает с ним.

Ответы [ 3 ]

0 голосов
/ 29 сентября 2018

Вы можете использовать этот запрос

db.col.aggregate([
                        {"$group" : {"_id" : "$name","data" : {"$first" : "$$ROOT"}}},
                        {"$project" : {
                            "tags" : "$data.tags",
                            "name" : "$data.name",
                            "rating" : "$data.rating",
                            "_id" : "$data._id"
                            }
                        }])
0 голосов
/ 30 сентября 2018

Вы можете использовать запрос агрегации ниже.

$$ROOT, чтобы сохранить весь документ под каждым именем, а затем $replaceRoot для продвижения документа наверх.

db.col.aggregate([
  {"$group":{"_id":"$name","doc":{"$first":"$$ROOT"}}},
  {"$replaceRoot":{"newRoot":"$doc"}}
])
0 голосов
/ 29 сентября 2018

Когда вы группируете данные в любой базе данных, это означает, что вы хотите выполнить накопленную операцию над обязательным полем, а другое поле, которое не будет включено в накопленную операцию, будет использоваться в такой группе, как

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