python - 如何使用嵌套 json 在 mongodb 中查询
问题描述
我有这个 json 文件:
{
"id" : 100,
"boolean": 1,
"color": 2,
"MYtable": [{"a":1, "b":2}],
"number": 4,
"string": 5
}
{
"id" : 200,
"boolean": 1,
"color": 22,
"MYtable": [{"a":10, "b":20,"c":30}],
"number": 42,
"string": 52
}
{
"id" : 300,
"boolean": 13,
"color": 223,
"MYtable": [],
"number": 423,
"string": 523
}
使用 mongodb 查询我只想获取 MYtable 大小为 1 或更大的元素。例如在上面的 json 中,我只会得到 id 为 100 和 200 的元素。
MYcollection 是我的数据库的集合。
我试过这个:
MYcollection.find({ "MYtable": {"$size": {"$gt" :1}}})
还有这个:
MYcollection.find({"$where" : "this.MYtable.length > 1"})
但它没有用。我错过了什么?
解决方案
您可以使用$expr
with$size
过滤文档
db.col.find({$expr : {$gt : [{$size : "$MYtable"},1]}})
尝试使用$expr
以下文档中的
$expr 比 $where 更快,因为它不执行 JavaScript,因此应尽可能首选。
编辑-1
您可能需要更改文档结构以存储数组元素
下面通过将 0 处的数组元素转换为数组来比较大小来与您一起使用文档结构
db.col.find({$expr:{$gt:[{$size:{$ifNull:[{"$objectToArray":{$arrayElemAt:[{$ifNull:["$MYtable",[]]},0]}},[]]}},1]}})
推荐阅读
- android - R8 问题:由于超出错误 GC 开销限制,无法设置 Proguard minifyEnabled
- swift - 如何在 Swift 的 tableView 中使用 if else 条件?
- unity3d - 不会出现真正的横幅,只是测试广告。怎么了?
- amazon-web-services - 如何以特定用户身份运行 aws cli 命令?
- android - RecyclerView 滚动条在 Android 的 Dialog Fragment 中不可见
- jsp - 在 Java 类方法中传递 HTML 元素的动态值
- java - Hibernate - 重新创建一个表并从一个表中分配主键(开始)
- laravel - 从控制器传递到视图时不显示数据
- c# - 以编程方式恢复 nuget 包(.net 核心和 .net 框架)
- excel - 删除 .Select 和 .Activate