Группа MongoDB по подполю массива

#mongodb #mongodb-query #aggregation-framework

#mongodb #mongodb-запрос #агрегация-фреймворк

Вопрос:

Здравствуйте, я новичок в MongoDB, пожалуйста, я надеюсь, что вы можете помочь мне с этим вопросом.

Моя коллекция будет выглядеть так:

 {
  "_id": { "$oid": "5f1fd47..." },
  "email":"c@c.com",
  "materials": [
    {
       "_id": { "$oid": "5f1fda2..." },
       "title": "MDF 18mm Blanco",
       "id": "mdf18blanco",
       "thickness": "18",
       "family": "MDF",
       "color": ""
    }, ...
    //others materials with different family
  ],
}
  

Я сделал агрегат, подобный этому:

 { "$match" : { "email" : "c@c.com" } }, 
{ "$unwind" : "$materials" }, 
{ "$group" : { "_id" : "$_id", "list" : { "$push" : "$materials.family" } } } 
  

и я возвращаю это:

 { 
    "_id" : ObjectId("5f1fd47d502e00051c673dd1"), 
    "list" : [
        "MDF", 
        "MDF", 
        "MDF", 
        "Melamina", 
        "Melamina", 
        "Melamina", 
        "Melamina", 
        "MDF", 
        "Melamina", 
        "Aglomerado", 
        "Aglomerado"
    ]
}
  

но мне нужно получить это

  { 
    "_id" : ObjectId("5f1fd47d502e00051c673dd1"), 
    "list" : [
        "MDF", 
        "Melamina", 
        "Aglomerado"
    ]
}
  

Я надеюсь, что вы понимаете мой вопрос и можете мне помочь, большое вам спасибо.

Ответ №1:

Все, что вам нужно сделать, это использовать $addToSet вместо $push на групповом этапе:

 { "$group" : { "_id" : "$_id", "list" : { "$addToSet" : "$materials.family" } } } 
  

Следует отметить, что $addToSet это не гарантирует определенный порядок, в отличие $push от случая, если это имеет значение для вас.

Ответ №2:

Вам нужно только изменить $push на $addToSet .

Набор не содержит повторяющихся значений, поэтому он работает.

 db.collection.aggregate([
  {
    "$match": {
      "email": "c@c.com"
    }
  },
  {
    "$unwind": "$materials"
  },
  {
    "$group": {
      "_id": "$_id",
      "list": {
        "$addToSet": "$materials.family"
      }
    }
  }
])
  

Пример игровой площадки Mongo