Java查询mongodb查找列表大小小于n的文档

标签 java mongodb mongodb-query

我正在尝试查找数据库中的所有文档,其中“状态”列表的大小仅包含一种状态,但我正在努力解决 java 代码的语法。

我的数据库看起来像这样:

{ "_id" : 13218 , "country" : { "MY" : 11 , "US" : 4} , "state" : { "WA" : 4 }}
{ "_id" : 95529 , "country" : { "US" : 6 } , "state" : { "MI" : 6 }}
{ "_id" : 22897 , "country" : { "US" : 4 } , "state" : { "CA" : 2 , "TX" : 1 , "WY" : 1 }}

我想要做的是打印出从美国找到的只有一个州的每个“_id”。因此,此处返回的唯一“_id”是 95529。

这是代码的相关部分:

DBObject query = new BasicDBObject("country.US", new BasicDBObject("$gt", 4));
//query.put("state.2", new BasicDBObject("$exists", true)); 
//This is my attempt at checking the list length but it doesn't work
DBCursor dbCursor = dBcollection.find(query);
while (dbCursor.hasNext()){
    DBObject record = dbCursor.next();
    Object _id= record.get("_id");
    Object state= record.get("state");      
    System.out.println(_id + "," + state);
}

当前输出如下所示:

95529, { "MI" : 6 }
22897, { "CA" : 2 , "TX" : 1 , "WY" : 1 }

最佳答案

您在这里遇到的根本问题是您的数据实际上不是“列表”。作为真正的“哈希”或“映射”,MongoDB 意义上没有“长度”的概念。

您最好更改数据以使用实际的“数组”,这就是列表的实际含义:

{
    "_id" : 13218 , 
    "country" : [
        { "code": "MY", "value" : 11 },
        { "code": "US", "value" : 4 },
    ],
    "state" : [{ "code": "WA", "value" : 4 }]
},
{ 
    "_id" : 95529 , 
    "country" : [{ "code": "US", "value" : 6 }], 
    "state" : [{ "code": "MI", "value" : 6 }]
},
{ 
    "_id" : 22897 ,
    "country" : [{ "code": "US", "value" : 4 }],
    "state" : [
        { "code": "CA", "value" : 2 }, 
        { "code": "TX", "value" : 1 }, 
        { "code": "WY", "value" : 1 }
    ]
}

然后,使用 $size 即可轻松获取那些仅具有单一状态的文档。运算符。

DObject query = new BasicDBObject("country", 
    new BasicDBObject( "$elemMatch", new BasicDBObject(
        "code", "US").put( "value", new BasicDBObject( "$gt", 4 ) 
    )
);

query.put( "state": new BasicDBObject( "$size", 1 ) );

这最终使您在发出查询时更加灵活,因为您不需要在每个查询中指定显式的“键”。另外如上所述,这里有一个长度的概念,否则不存在。

如果您将数据保留为当前形式,那么唯一的方法就是使用 $where 的 JavaScript 评估运算符(operator)。这不是很有效,因为需要为每个文档运行解释代码以确定条件是否匹配:

DBObject query = new BasicDBObject("country.US", new BasicDBObject("$gt", 4));
query.put("state", new BasicDBObject( "$type", 3 ));
query.put("$where","return Object.keys( this.state ).length === 1");

还使用$type运算符,以确保“状态”确实存在并且是预期的“对象”。这是可能的,但对性能来说并不是一个真正好的主意。

尝试更改您的文档结构,因为这样可以在不使用 JavaScript 计算的情况下进行其他类型的查询。

关于Java查询mongodb查找列表大小小于n的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25049742/

相关文章:

node.js - 如何在同一结果中显示两个单独的子文档?

node.js - 对象数组中的 MongoDB,仅显示具有指定值的对象

java - MongoDb upsert 异常无效的 BSON 字段

mongodb - 在 upsert 期间使用 $set 和 $setOnInsert

javascript - MongoDB - 获取从开始日期到结束日期的数据

Java Sigma 方程求解 sigma(i=1 to k)((-1)^i+1)(i)(i+1) 长值超时

java - java中泛型类型的组成

java - Hibernate注解连接问题

java - 与数据库无关的数据库加密

php - MongoConnectionException - 未找到候选服务器