Это моя коллекция теста:Проверьте встраивать существует - агрегация рамка MongoDB
>db.test.find()
{
"_id": ObjectId("54906479e89cdf95f5fb2351"),
"reports": [
{
"desc": "xxx",
"order": {"$id": ObjectId("53fbede62827b89e4f86c12e")}
}
]
},
{
"_id": ObjectId("54906515e89cdf95f5fb2352"),
"reports": [
{
"desc": "xxx"
}
]
},
{
"_id": ObjectId("549067d3e89cdf95f5fb2353"),
"reports": [
{
"desc": "xxx"
}
]
}
Я хочу, чтобы сосчитать все документы и документы с порядком, так:
>db.test.aggregate({
$group: {
_id: null,
all: {
$sum: 1
},
order: {
$sum: {
"$cond": [
{
"$ifNull": ["$reports.order", false]
},
1,
0
]
}
}
}
})
и мои результаты:
{
"result" : [
{
"_id" : null,
"all" : 3,
"order" : 3
}
],
"ok" : 1
}
но ожидаемый:
{
"result" : [
{
"_id" : null,
"all" : 3,
"order" : 1
}
],
"ok" : 1
}
Не имеет значения, что я буду устанавливать - «$ reports.order», «$ reports.xxx» и т. Д., Проверка агрегации проверяется только в том случае, если отчеты о поле существует, игнорирует вставку. $ ifNull и $ eq не работают с вложенными документами? Есть ли способ сделать что-то вроде этого
db.test.find({"reports.order": {$exists: 1}})
в рамках агрегации? Извините за мой английский, и я надеюсь, что вы поняли, что я хочу вам показать :)
Почему не просто 'db.test.count()' для подсчета общего количества документов и 'db.test.count ({" reports.order ": {" $ exists ": true}})' to подсчитать количество документов с заказом? – wdberkeley
, потому что я хочу сделать это в одном запросе, это часть некоторого статистического построителя запросов, который был всего лишь примером кода, чтобы показать проблему – Bartosz