使用 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 相关联的原因是我不关心数组中的值是什么。

你在这里混合了几件事。

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

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

BasicDBObject query = new BasicDBObject("key.1", null);实际上是要求Mongo在索引1处查询key数组的值/文档以获取null值。如果您有类似的东西,这将匹配

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

好的,现在回到帖子。如果你不关心价值,你必须使用$exist运算符。外壳过滤器将被{"key":{"$elemMatch":{"1":{ $exists: true}}}}.请注意,使用$elemMatch进行字段级别比较,因为点表示法与索引样式访问冲突。对于字符串名称字段,点表示法和elemMatch对于涉及单个查询条件的查询的嵌入式数组的工作方式类似。

爪哇代码

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/

最新更新