gpt4 book ai didi

java - 检查 Mongodb java 驱动程序中是否存在子字段

转载 作者:行者123 更新时间:2023-12-02 12:22:06 24 4
gpt4 key购买 nike

我使用的是 mongodb 版本 3.4,带有 java 驱动程序。

我有一个这种格式的 json 集合:

{
"foo": {
"d4231ds": {
"type":"A",
"color":"red"
},
"dmncxa3s": {
"type":"B",
"color":"yellow"
},

"JsdjS8": {
"type":"A",
"color":"red"
},

"SKJDcxar3": {
"type":"C",
"color":"green"
}
},
"bar": "100011"
}

我需要使用java获取所有具有“type”:“A”的文档。 foo 下的键(d4231ds、dmncxa3s 等)事先未知,并且文档之间有所不同。因此,在这种情况下使用点运算符不起作用。

我尝试过寻找几种方法,但似乎没有实现这一目标。

最佳答案

您可以在最新的3.4服务器版本中尝试以下聚合。

使用 $objectToArray 将命名键转换为键值对( k, v )并使用 $in 查询值文档对于字段type = A

$redact 作用于查询过滤器的结果,$$KEEP 当匹配时 $$PRUNE

 MongoClient mongoClient = new MongoClient();
MongoDatabase database = mongoClient.getDatabase(db_name);
MongoCollection<Document> mongoCollection = database.getCollection(collection_name);
Document query = Document.parse("{\"$redact\":{\"$cond\":[{\"$let\":{\"vars\":{\"subelems\":{\"$objectToArray\":\"$foo\"}},\"in\":{\"$in\":[\"A\",\"$$subelems.v.type\"]}}},\"$$KEEP\",\"$$PRUNE\"]}}");
List<Document> result = mongoCollection.aggregate(Arrays.asList(query)).into(new ArrayList<>());

Mongo Shell 查询:

db.collection_name.aggregate([
{
"$redact": {
"$cond": [
{
"$let": {
"vars": {
"subelems": {
"$objectToArray": "$foo"
}
},
"in": {
"$in": [
"A",
"$$subelems.v.type"
]
}
}
},
"$$KEEP",
"$$PRUNE"
]
}
}
])

关于java - 检查 Mongodb java 驱动程序中是否存在子字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45694305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com