У меня есть документ следующего формата:
{
"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" } } }
])
Он должен работать. Я не вижу проблемы в указанном выше запросе
Спасибо, в моем большом запросе была опечатка, которой не было, когда я свернул ее для публикации здесь!
Следует иметь в виду еще кое-что: при выполнении $ unwind -> $ match рекомендуется продублировать стадию $ match перед $ unwind. Первое совпадение $ вернет только те документы, которые содержат хотя бы одну запись P.Workspaces, где Status - «что-то». Это уменьшит количество документов, поступающих в конвейер агрегации, а также позволит операции использовать индекс для этого поля. (Агрегация как есть будет сканировать коллекцию). Затем второе совпадение отфильтрует все остальные записи в массиве «Рабочие области», где «Статус» не является «чем-то».
Спасибо за совет!

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}
Я скопировал и вставил это точно так же, как у вас, и у меня это работает.