mongodb - MongoDB $gte 无法匹配嵌套文档的字段
问题描述
我正在尝试查询一个简单的 JSON 以返回values.time
大于 10 的所有匹配项:
{ key: "key1",
values: [
"{\"object\":\"some object1\",\"time\":11}",
"{\"object\":\"some object2\",\"time\":9}",
]
}
查询是通过 Java API 完成的:
FindIterable<Document> documents = collection.find(gte("values.time", 10));
请查看更新并查找 mongo 报告的命令:
10:13:10.126 [main] DEBUG org.mongodb.driver.protocol.command - Sending command '{"update": "collection1", "ordered": true, "$db": "db1", "updates": [{"q": {"key": "key1"}, "u": {"$push": {"values": "{\"object\":\"some object\",\"time\":11}"}}}]}' with request id 31 to database db1 on connection [connectionId{localValue:2, serverValue:35}] to server localhost:27017
10:13:10.128 [main] DEBUG org.mongodb.driver.protocol.command - Execution of command with request id 31 completed successfully in 2.02 ms on connection [connectionId{localValue:2, serverValue:35}] to server localhost:27017
10:13:10.130 [main] DEBUG org.mongodb.driver.protocol.command - Sending command '{"find": "collection1", "filter": {"values.time": {"$gte": 10}}, "$db": "db1"}' with request id 32 to database db1 on connection [connectionId{localValue:2, serverValue:35}] to server localhost:27017
然而,从未找到匹配项。我究竟做错了什么?使用 Java API 的答案是首选。
解决方案
您显示的文件:
{ key: "key1",
values: [
"{\"object\":\"some object1\",\"time\":11}",
"{\"object\":\"some object2\",\"time\":9}",
]
}
包含 2 个字段 -key
包含一个字符串,并values
包含一个字符串数组。
您可以通过运行此聚合来测试它:
db.collection1.aggregate([
{$match: {key: "key1"}},
{$project: {
valueType:{
$map:{
input:"$values",
in:{$type:"$$this"}
}
},
_id:0
}}
])
您推送的元素也是一个字符串,而不是一个对象。
如果您用实际对象替换这两个字符串,它应该可以工作。
推荐阅读
- python - 从旧数据框创建子列
- python - 模块中的 Import 语句是否可用于主脚本?
- javascript - 如何使用按钮或在一定时间后更改图像?
- swift - Swift Combine,当只有一个发布者的值发生变化时,如何合并发布者和接收者?
- plotly - 分类分组条形图中的形状定位
- node.js - 如何在 Postman 中上传图像文件并使用 Express 和 Multer 回显相同的图像
- xamarin - 避免反射开销
- azure-devops - Azure yaml 文件中 imageRepository 中的条件分支名称
- xml - XSLT 1.0 - 检查允许的值集,如果找到则返回找到的值
- r - 使用 mapply 或 lapply 到嵌套列表