mongodb - 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
呢?
解决方案
您可以尝试以下聚合查询:
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
在查询语言中执行聚合表达式。
参考: 聚合管道
推荐阅读
- raspberry-pi - Raspberry Pi 3b+ 上的 Modbus RTU 作为主机
- php - 连接两个包含所有记录的表
- c++ - C ++获取两个数组的总和
- c# - 使用其他文件夹将 zip 文件提取到字符串位置
- blockchain - 如何控制对存储在区块链上的个人信息的访问(带有教育用例)
- reactjs - 浏览器没有显示输出
- python - 添加新列,根据多个条件进行分类
- docker - 当我添加 args 时,gcloud run deploy 不断出错:'--args: expected one argument'
- qt - 如何在另一个 QML 文件中通过 id 引用项目?
- python - 由于 jsonschema 无法编译 python 程序