#mongodb
#mongodb
Вопрос:
представьте, что у нас есть список книг:
{
"_id" : ObjectId("1"),
"title" : "Fantasy 1",
,
"Characters" : ["Harry Potter", "Voldemort", "Aragorn"
],
}
{
"_id" : ObjectId("2"),
"title" : "Fantasy 2",
"Characters" : ["Harry Potter", "Vito Corleone"
],
}
{
"_id" : ObjectId("3"),
"title" : "Fantasy Final",
"Characters" : ["Harry Potter", "Legolas"
],
}
Я хотел бы объединить символы в новую коллекцию (называемую «Char»). Затем я хотел бы сгруппировать их так, чтобы имя символа не повторялось. Кроме того, я хотел бы подсчитать, сколько там символов.
До сих пор я делал это:
step1 = {$unwind : "$Characters"}
query1 = {"_id" : 0}
step2 = {$project : query1}
step3 = {$out: "Char"}
steps = [step1, step2, step3]
db.movies.aggregate(steps)
db.Char.distinct("Characters").length
Я пока не знаю, хорошо ли я это делаю. Кроме того, как вы можете видеть, я не знаю, как группировать одни и те же символы.
Спасибо!
Ответ №1:
Вам нужен этот запрос:
db.collection.aggregate([
{
"$unwind": "$Characters"
},
{
"$group": {
"_id": null,
"characters": {
"$addToSet": "$Characters"
}
}
},
{
"$project": {
"size": {
"$size": "$characters"
},
_id: 0
}
}
])
Прежде всего, запрос $unwind
для каждого символа, чтобы получить все. $group
По полю «Символы» и используйте $addToSet
, чтобы избежать дубликатов.
Тогда только вам нужно использовать project для вычисления размера.
Пример здесь