代码之家  ›  专栏  ›  技术社区  ›  Yan Khonski

javaspring数据Mongo中的mongodb请求

  •  0
  • Yan Khonski  · 技术社区  · 6 年前

    我在文档中有一个数组。

    {
        "id" : "id_1",
        "name" : "name_1";
        "additionalData" : [
            {
                 "additionalDataId" : "id_1_1",
                 "additionalDataName" : "name_1_1",
                 "longText" : "A long story about..."  
            },
            {
                 "additionalDataId" : "id_1_2",
                 "additionalDataName" : "name_1_2",
                 "longText" : "A longer story about danger..."  
            },
            {
                 "additionalDataId" : "id_1_3",
                 "additionalDataName" : "name_1_3",
                 "longText" : "A longer story about danger and courage"  
            },
        ]       
    }
    

    检索名为的数组元素 "name_1_2"

    db.collection.find( { name: "name_1"},
            { _id: 0, additionalData: { $elemMatch: { "additionalDataName": "name_1_2" } } 
        })
    

    如何使用 mongoTemplate ?

    我试过了

    Aggregation aggregation = Aggregation.newAggregation(
        Aggregation.match(
                Criteria.where("name").is("name_1").and("additionalData.additionalDataName").is("name_1_2")
            ),
        Aggregation.project("additionalData"),
    

    mongoTemplate.aggregate(聚合,“客户对象”,对象.类);

    我也试着用 ArrayOperators.Filter.filter

    Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.match(Criteria.where("name").is("name_1")),
            Aggregation.project("additionalData").and(
                    ArrayOperators.Filter.filter("additionalData").as("item")
                            .by(ComparisonOperators.valueOf("item.additionalDataName").equalTo("name_1_2"))
            )
        );
    mongoTemplate.aggregate(aggregation, "CustmObjects", Object.class);
    

    https://stackoverflow.com/a/46769125/4587961

    总之,我得到的结果是数组的所有元素。

    0 回复  |  直到 6 年前
        1
  •  1
  •   Mher Davtyan    5 年前

    如果我正确地理解了这个问题,这将得到预期的结果。

    Query query = new Query(new Criteria().andOperator(
        Criteria.where("name").is("name_1"),
        Criteria.where("additionalData.additionalDataName").is("name_1_2")
    ));
    query.fields().include("additionalData").exclude("_id");
    
    List<Document> results = template.find(query, collectionName, org.bson.Document.class);