首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存在MongoDB aggregate by字段

存在MongoDB aggregate by字段
EN

Stack Overflow用户
提问于 2014-08-26 10:31:57
回答 6查看 83.6K关注 0票数 71

我很难相信这个问题还没有人问过,也没有人回答过,但我找不到任何线索。

我有一个MongoDB聚合查询,它需要按一个布尔值进行分组:另一个字段的存在。

例如,让我们从这个集合开始:

代码语言:javascript
复制
> 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个文档有"field",2个没有。请注意,"field“的每个值可能是不同的;我们只想根据它的存在进行分组(或者非空值也适用于我,我没有存储任何空值)。

我尝试过使用$project,但是$exists并不存在,而且$cond和$ifNull也没有帮助我。该字段始终显示为存在,即使它不存在:

代码语言:javascript
复制
> db.test.aggregate(
  {$project:{fieldExists:{$cond:[{$eq:["$field", null]}, false, true]}}},
  {$group:{_id:"$fieldExists", count:{$sum:1}}}
)
{ "_id" : true, "count" : 4 }

我希望以下更简单的聚合可以工作,但由于某些原因,$exists不支持这种方式:

代码语言:javascript
复制
> 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

有人知道如何从这样的集合中获得想要的结果吗?

预期结果:

代码语言:javascript
复制
{ "_id" : true, "count" : 2 }
{ "_id" : false, "count" : 2 }
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-08-27 04:59:31

我昨天晚上用这种方式解决了同样的问题:

代码语言:javascript
复制
> 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

票数 103
EN

Stack Overflow用户

发布于 2017-09-07 13:44:29

我通过检查undefined解决了这个问题

代码语言:javascript
复制
$ne : [$var_to_check, undefined]

代码语言:javascript
复制
$ne:  [ { $type : "$var_to_check"}, 'missing'] }

如果定义了var,则返回true

票数 38
EN

Stack Overflow用户

发布于 2019-02-07 21:06:13

不知道是怎么回事,但现在2019年有了干净的解决方案。在聚合管道中执行此操作

代码语言:javascript
复制
$match: {"my_field": {$ne: null}}

好东西在我的lang 'ne‘意思是不:)

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25497150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档