2017-04-25 49 views
0

我尝试查询下面的MongoDB文档结构;使用Java搜索MongoDB文档子阵列

{ 
    "key": [{ 
     "1": [ 
     2, 
     3, 
     4 
     ] 
    }, 
    { 
     "2": [ 
     1 
     ] 
    } 
    ] 
} 

我要的是有自己的子场为“1”的key领域内具有的所有文件。与之相关的数组是[2,3,4],它们是java Long值。我正试图用下面的代码来完成上面的逻辑,但没有运气;

BasicDBObject query = new BasicDBObject("key.1", null); 
MongoCursor<BasicDBObject> cursor = collection.find(query).iterator(); 
while (cursor.hasNext()) { 
    System.out.println(cursor.next()); 
} 

的原因,我在查询对象空关联key.1是因为我不在乎数组中的值是什么。

回答

0

你在这里混合了几件事情。

key.1与使用数字字符串名查询子字段的点符号语法冲突。

这将与数组key的索引访问冲突。

BasicDBObject query = new BasicDBObject("key.1", null);实际上是要求Mongo查询key数组的索引值为1的值null值。这将匹配,如果你有类似的东西

{ 
    "key": 
    [ 
     {"1":"one"}, 
     null 
    ] 
} 

好吧,现在回来后。如果你不关心价值,你必须使用$exist运算符。外壳过滤器将是{"key":{"$elemMatch":{"1":{ $exists: true}}}}。注意使用$elemMatch做字段级比较,因为点符号与索引样式访问冲突。对于字符串名称字段,点符号& elemMatch对于涉及单个查询条件的查询的嵌入式数组工作方式类似。有关运营商和语法

Java代码

BasicDBObject exists = new BasicDBObject("$exists", true); 
BasicDBObject field = new BasicDBObject("1", exists); 
BasicDBObject elemMatch = new BasicDBObject("$elemMatch", field); 
BasicDBObject query = new BasicDBObject("key", elemMatch); 

更多信息。

https://docs.mongodb.com/manual/reference/operator/query/exists/

https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#op._S_elemMatch

https://docs.mongodb.com/manual/core/document/

+0

完美。非常感谢你的链接。 – StackUser