我正在尝试查找我的数据库中的所有文档,其中“状态”列表的大小只包含一个状态,但我正在努力学习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 }
答案 0 :(得分: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评估。这不是非常有效,因为需要为每个文档运行解释的代码以确定条件是否匹配:
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评估的情况下进行其他类型的查询。