Как использовать $ unwind и $ match с MongoDB?

У меня есть документ следующего формата:

{
  "P": {
        "Workspaces": [
           {
              "Key": "Value1",
              "Size": 2.27,
              "Status": 'something'
           },
            {
              "Key": "Value2",
              "Size": 3.27,
              "Status": 'somethingelse'
           }
         ]
     }
}

Следующий запрос правильно возвращает среднее значение.

db.collection.aggregate([ 
          { $unwind: "$P.Workspaces" }, 
          { $group: { _id: "$P.Workspaces.Key", average: { $avg: "$P.Workspaces.Size" } } } 
      ])

Я пытаюсь добавить совпадение, чтобы отфильтровать статус, как показано ниже. Однако я не получаю никакого результата, хотя есть документы с соответствующим статусом. Я пытаюсь отфильтровать результаты, прежде чем брать среднее. Я что-то упустил?

db.collection.aggregate([ 
  { $unwind: "$P.Workspaces" }, 
  { $match: { "P.Workspaces.Status":'something'}},
  { $group: { _id: "$P.Workspaces.Key", average: { $avg: "$P.Workspaces.Size" } } } 
  ])

Я скопировал и вставил это точно так же, как у вас, и у меня это работает.

Michael Cox 03.01.2019 23:15

Он должен работать. Я не вижу проблемы в указанном выше запросе

Ashh 04.01.2019 04:17

Спасибо, в моем большом запросе была опечатка, которой не было, когда я свернул ее для публикации здесь!

Nemo 04.01.2019 04:49

Следует иметь в виду еще кое-что: при выполнении $ unwind -> $ match рекомендуется продублировать стадию $ match перед $ unwind. Первое совпадение $ вернет только те документы, которые содержат хотя бы одну запись P.Workspaces, где Status - «что-то». Это уменьшит количество документов, поступающих в конвейер агрегации, а также позволит операции использовать индекс для этого поля. (Агрегация как есть будет сканировать коллекцию). Затем второе совпадение отфильтрует все остальные записи в массиве «Рабочие области», где «Статус» не является «чем-то».

Adam Harrison 04.01.2019 05:21

Спасибо за совет!

Nemo 04.01.2019 10:39
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
5
65
1

Ответы 1

db.articles.aggregate(
[ { $match : { author : "dave" } } ]
);

В примерах используется коллекция статей со следующими документами:

{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 } { "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "views" : 521 } { "_id" : ObjectId("55f5a192d4bede9ac365b257"), "author" : "ahn", "score" : 60, "views" : 1000 } { "_id" : ObjectId("55f5a192d4bede9ac365b258"), "author" : "li", "score" : 55, "views" : 5000 } { "_id" : ObjectId("55f5a1d3d4bede9ac365b259"), "author" : "annT", "score" : 60, "views" : 50 }

В примерах используется коллекция статей со следующими документами: {"_id": ObjectId ("512bc95fe835e68f199c8686"), "author": "dave", "score": 80, "views": 100} {"_id": ObjectId ("512bc962e835e68f199c8687"), "author": "dave", "score": 85, "views": 521} {"_id": ObjectId ("55f5a192d4bede9ac365b257"), "author": "ahn", "score": 60, "views": 1000} {"_id": ObjectId ("55f5a192d4bede9ac365b258"), "author": "li", "score": 55, "views": 5000} {"_id": ObjectId ("55f5a1d3d4bede9ac365b259" ), "author": "annT", "score": 60, "views": 50}

koteswararao pv 04.01.2019 06:30

Другие вопросы по теме