MongoDB: $ out группирует одно и то же значение

#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 для вычисления размера.

Пример здесь