Мне тяжело полагать, что этот вопрос не задан и нигде не ответил, но я не могу найти его.
У меня есть запрос агрегации MongoDB, который нужно группировать по булеву: наличие другого поля.
Например, начните с этой коллекции:
> db.test.find()
{ "_id" : ObjectId("53fbede62827b89e4f86c12e"),
"field" : ObjectId("53fbede62827b89e4f86c12d"), "name" : "Erik" }
{ "_id" : ObjectId("53fbee002827b89e4f86c12f"), "name" : "Erik" }
{ "_id" : ObjectId("53fbee092827b89e4f86c131"),
"field" : ObjectId("53fbee092827b89e4f86c130"), "name" : "John" }
{ "_id" : ObjectId("53fbee122827b89e4f86c132"), "name" : "Ben" }
2 документа имеют "поле", а 2 нет. Обратите внимание, что каждое значение поля может отличаться; мы просто хотим сгруппировать по его существованию (или для меня тоже ненулевое значение, у меня нет никаких нулевых значений).
Я пробовал использовать $project, но $существует там не существует, а $cond и $ifNull мне не помогли. Поле всегда, кажется, существует, даже если оно не выполняется:
> db.test.aggregate(
{$project:{fieldExists:{$cond:[{$eq:["$field", null]}, false, true]}}},
{$group:{_id:"$fieldExists", count:{$sum:1}}}
)
{ "_id" : true, "count" : 4 }
Я бы ожидал, что следующий гораздо более простой агрегат будет работать, но по какой-то причине $exists не поддерживается таким образом:
> db.test.aggregate({$group:{_id:{$exists:"$field"}, count:{$sum:1}}})
assert: command failed: {
"errmsg" : "exception: invalid operator '$exists'",
"code" : 15999,
"ok" : 0
} : aggregate failed
Error: command failed: {
"errmsg" : "exception: invalid operator '$exists'",
"code" : 15999,
"ok" : 0
} : aggregate failed
at Error (<anonymous>)
at doassert (src/mongo/shell/assert.js:11:14)
at Function.assert.commandWorked (src/mongo/shell/assert.js:244:5)
at DBCollection.aggregate (src/mongo/shell/collection.js:1149:12)
at (shell):1:9
2014-08-25T19:19:42.344-0700 Error: command failed: {
"errmsg" : "exception: invalid operator '$exists'",
"code" : 15999,
"ok" : 0
} : aggregate failed at src/mongo/shell/assert.js:13
Кто-нибудь знает, как получить желаемый результат из такой коллекции?
Ожидаемый результат:
{ "_id" : true, "count" : 2 }
{ "_id" : false, "count" : 2 }