我有以下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/