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