Это может не полностью ответить на ваш вопрос, но может помочь
как получить отдельный идентификатор коктейля (повторы не допускаются)
Ваш cocktail
находится в массиве, поэтому прямой group
или distinct
может не работать, вы можете использовать $unwind
.
То, что делает $ unwind, позволяет вам отделять документ для каждого элемента
и возвращает полученный документ
Например: для этого объекта
{id=1001, name="Res1", coor=[12.392, 19.123], cocktail=[13, 0, 92]}
и этот запрос
db.temp.aggregate( [ { $unwind: "$cocktail" } ] )
приведет к
{ "_id" : 1001, "name" : "Res1", coor=[12.392, 19.123],, "cocktail" : 13 }
{ "_id" : 1001, "name" : "Res1", coor=[12.392, 19.123],, "cocktail" : 0 }
{ "_id" : 1001, "name" : "Res1", coor=[12.392, 19.123],, "cocktail" : 92 }
Теперь, когда у вас есть все индивидуальные записи, вы можете сгруппировать по коктейлю
db.temp.aggregate( [ { $unwind: "$cocktail" },
{
"$group": {
_id: {
"_id": "$_id",
items: {$addToSet: '$cocktail'}}
}
}
}
] );
Это должно ответить на ваш первый запрос
Для получения имен коктейлей вам нужно использовать поиск, группировать и проектировать что-то вроде этого
db.temp.aggregate([
{
"$unwind": "$cocktail"
},
{
"$lookup": {
"from": "cocktail ",
"localField": "restaurant.cocktail._id",
"foreignField": "_id",
"as": "cocktails"
}
},
{ "$unwind": "$cocktails" },
{
"$group": {
"_id": "$_id",
"cocktail": { "$cocktail": "$cocktail" },
}
},
{
"$project": {
"name": 1,
"coor" : 1,
"cocktail.name" : 1,
}
}
]).pretty()
Примечание: Это всего лишь один из подходов, который может быть не лучшим и не проверенным.