Как получить только те документы, которые имеют 3 разных значения в mongodb? - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть следующие данные в mongodb:

    {
        "_id" : ObjectId("111"),
        "id" : "111",
        "classification" : [ 
            {
                "annotator" : "annotatorName1",
                "category" : "white"
            }, 
            {
                "annotator" : "annotatorName2",
                "category" : "white"
            }, 
            {
                "annotator" : "annotatorName3",
                "category" : "black"
            }
        ]
    }

   {
        "_id" : ObjectId("222"),
        "id" : "222",
        "classification" : [ 
                   {
                "annotator" : "annotatorName1",
                "category" : "white"
            }, 
            {
                "annotator" : "annotatorName2",
                "category" : "blue"
            }, 
            {
                "annotator" : "annotatorName3",
                "category" : "black"
            }
        ]
    }

  {
        "_id" : ObjectId("333"),
        "kind" : "youtube#video",
        "etag" : "tagvalue",
        "id" : "333"
    }

Обратите внимание, что ярлык classification существует не во всех моих записях , как показано в записи с идентификатором: "333 ".

Мне нужно получить все записи из моей базы данных, которые имеют разные значения category.Итак, мне нужен запрос, что при запуске я получу только запись, которая имеет метку classification и имеет ровно 3 различных значения category, в данном случае я хочу запросэто мне только вернет:

{
        "_id" : ObjectId("222"),
        "id" : "222",
        "classification" : [ 
            {
                "annotator" : "annotatorName1",
                "category" : "white"
            }, 
            {
                "annotator" : "annotatorName2",
                "category" : "blue"
            }, 
            {
                "annotator" : "annotatorName3",
                "category" : "black"
            }
        ]
    }

Какую команду я должен ввести в своем терминале, чтобы получить все записи, которые имеют 3 уникальных category значения в classification, IFF classification существует?

Спасибо за помощь.

1 Ответ

0 голосов
/ 08 ноября 2018

Приведенный ниже агрегат можно использовать для определения идентификаторов, которые имеют ровно 3 уникальные категории:

db.collectionName.aggregate([
  {$match : {classification : {$exists : true}}},
  {$unwind: "$classification"},
  {$group: { _id: "$id", uniqueCategories: {$addToSet: "$classification.category"}}},
  {$project: {_id : 1, numberOfCategories: {$size: "$uniqueCategories"}} },
  {$match: {numberOfCategories: 3} }
])

Объяснение: Мы начинаем с сопоставления документов, которые имеют классификацию элемент.Затем мы раскручиваем его, чтобы разделить встроенный массив на отдельные документы.Затем он группируется по идентификатору, и с помощью $addToSet категории собираются в массив - это устраняет любые ошибки.Затем мы проецируем его $size и сопоставляем по 'равно 3'.

Этот агрегат даст документы с установленным _id в поле id документов в вашей коллекции, которые имеют 3 уникальные категории, которые вы можетеиспользовать, чтобы добраться до документов.Если размер вашей коллекции достаточно велик, вам следует рассмотреть возможность добавления еще одного этапа $match в начале, чтобы ограничить набор данных.В настоящее время он будет выполнять сканирование коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...