我很难相信这个问题还没有在某个地方被问到和回答,但我找不到任何线索.

我有一个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个没有.

我try 过使用$project,但$exists不存在,而且$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

有人知道如何从这样的Collection 中得到想要的结果吗?

预期结果:

{ "_id" : true, "count" : 2 }
{ "_id" : false, "count" : 2 }

推荐答案

昨晚我解决了同样的问题,方法如下:

> db.test.aggregate({$group:{_id:{$gt:["$field", null]}, count:{$sum:1}}})
{ "_id" : true, "count" : 2 }
{ "_id" : false, "count" : 2 }

有关如何工作的完整解释,请参见http://docs.mongodb.org/manual/reference/bson-types/#bson-types-comparison-order.

Mongodb相关问答推荐

MongoDB通过查找具有多个数组的对象进行聚合

如何用Python和MongoDB找到单据字段的最大值?

在MongoDB集合中按文档内的频率对数组排序

Mongo,通过 Lookup 计算多个文档中数组中的项目

lexik_jwt_authentication下无法识别的选项api_platform

MongoDB 使用 pymongo 收集 500K 文档的写入速度很差

在运算符 $map 中嵌入运算符 $exists

用Golang减go mongodb中的两个字段

如何根据_id删除文档?

哪个库最适合用于带有 Scala 的 MongoDB?

使用 Flask-pymongo 扩展通过 _id 在 MongoDB 中搜索文档

mongodb 中的 --bindip 配置选项有什么作用?

使用 MongoDB 进行分页

如何在 MongoDB 中进行内部连接?

MongoDB 批处理操作的最大大小是多少?

如何在 mongoDB 中聚合巨大的数组?

文本的 MongoID 数据类型

如何在 $match 内的 mongodb 聚合查询中使用 $regex

即使重新安装后,Mongo 仍在等待 27017

对象不是 JSON 可序列化的