簡體   English   中英

檢查Mongodb Java驅動程序中是否存在子字段

[英]Check for sub field existence in Mongodb java driver

我正在使用帶有Java驅動程序的mongodb 3.4版。

我有以下格式的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"
      ]
    }
  }
])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM