首页 > 解决方案 > Mongo查询具有特定值以外的键的嵌入文档

问题描述

我有一个看起来像这样的 mongo (3.6) 集合(ISODates 设置为不同的时间,实际时间在这里并不重要):

{_id: 0}
{_id: 1, a: null}
{_id: 2, a: {}}
{_id: 3, a: {"0": ISODate("...")}}
{_id: 4, a: {"1625": ISODate("...")}}
{_id: 5, a: {"0": ISODate("..."), "1625": ISODate("...")}}
{_id: 6, a: {"7": ISODate("..."), "900": ISODate("...")}}

我想查询该a字段(如果存在,则始终是嵌入式文档)包含至少一个键值不是“0”的文档。所以在我的示例中,它将返回文档 4、5 和 6。

我知道我可以用一个$where子句来做到这一点,但是有没有办法不使用$where呢?

标签: mongodbmongodb-queryaggregation-framework

解决方案


您可以尝试以下聚合查询:

db.collection.find({
    $and: [
      { a: { $type: "object" } },
      { a: { $ne: {} } }, // This is optional but might improve performance by remove empty objects `{}` to next step.
      { $expr: { $gt: [ { $size: { $filter: { input: { $objectToArray: "$a" }, cond: { $ne: [ "$$this.k", "0" ] } } } }, 0 ] } }
    ]
  })

测试: mongoplayground

注意:如果您不想在 中执行函数,可以尝试此查询$where,此查询用于$expr在查询语言中执行聚合表达式。

参考: 聚合管道


推荐阅读