首页 > 解决方案 > 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 的答案是首选。

标签: mongodbmongodb-query

解决方案


您显示的文件:

{ 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
        }}
])

您推送的元素也是一个字符串,而不是一个对象。

如果您用实际对象替换这两个字符串,它应该可以工作。


推荐阅读