使用Java搜索MongoDB文档子阵列

时间:2017-04-25 01:27:55

标签: java mongodb

我正在尝试查询以下MongoDB文档结构;

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

我想要的是key字段内的所有文档,其子字段为" 1"。与之关联的数组是[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与null关联的原因是因为我不关心数组中的值是什么。

1 个答案:

答案 0 :(得分:0)

你在这里混合了几件事。

key.1是用于使用数字字符串名称查询子字段的冲突点表示法语法。

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

BasicDBObject query = new BasicDBObject("key.1", null);实际上是要求Mongo在索引1处为key值查询值{/ 1}数组。如果您有类似

的内容,这将匹配
null

好的,现在回来发帖。如果您不关心价值,则必须使用{ "key": [ {"1":"one"}, null ] } 运营商。 shell过滤器将为$exist。请注意使用{"key":{"$elemMatch":{"1":{ $exists: true}}}}进行字段级别比较,因为点符号与索引样式访问冲突。对于字符串名称字段,点符号&amp;对于涉及单个查询条件的查询,elemMatch对嵌入式数组的工作方式类似。

Java代码

$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/