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

时间:2017-08-15 13:51:29

标签: java mongodb

我正在使用mongodb 3.4版,带有java驱动程序。

我有这种格式的jsons集合:

{
    "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等)事先不知道,文档之间也不同。因此,在这种情况下使用点运算符不起作用。

我已经尝试了几种方法,但似乎没有达到这个目的。

1 个答案:

答案 0 :(得分:1)

您可以在最新的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"
      ]
    }
  }
])