Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于mongodb查找列表大小小于n的文档的Java查询_Java_Mongodb_Mongodb Query - Fatal编程技术网

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

用于mongodb查找列表大小小于n的文档的Java查询,java,mongodb,mongodb-query,Java,Mongodb,Mongodb Query,我试图找到数据库中的所有文档,其中“states”列表的大小只包含一个状态,但我正在努力解决java代码的语法问题 我的数据库如下所示: { "_id" : 13218 , "country" : { "MY" : 11 , "US" : 4} , "state" : { "WA" : 4 }} { "_id" : 95529 , "country" : { "US" : 6 } , "state" : { "MI" : 6 }} { "_id" : 22897 , "country" : {

我试图找到数据库中的所有文档,其中“states”列表的大小只包含一个状态,但我正在努力解决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 }}
95529, { "MI" : 6 }
22897, { "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);
}
当前输出如下所示:

{ "_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 }}
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 }
    ]
}
然后,获取那些只有一个状态的文档只需使用操作符即可

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 ) );
这最终在发出查询时为您提供了更大的灵活性,因为您不需要在每个查询中指定显式的“键”。同样如前所述,这里有一个不存在的长度概念

如果您保持数据的当前形式,那么唯一的方法就是使用操作符的JavaScript求值。这不是很有效,因为需要为每个文档运行解释代码以确定条件是否匹配:

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");
还可以使用运算符,以确保“状态”实际存在,并且是预期的“对象”。这是可能的,但不是一个真正的好主意


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

感谢您的深入解释。不幸的是,我无法更改数据结构,因此我不得不使用现有的数据结构。我尝试将代码与
$where
操作符一起使用,但在线程“main”com.mongodb.MongoException:TypeError:Object.keys调用了“ys(this.state).leng”附近的非对象,这意味着“state”在所有文档中都不存在或为null。我还显示了
$type
操作符的用法,以便通过不选择文档来应对这种情况。