【问题标题】:Mongo DB request in Java Spring-data MongoJava Spring-data Mongo中的Mongo DB请求
【发布时间】:2019-03-05 23:27:54
【问题描述】:

我在文档中有一个数组。

{
    "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" 的数组元素,我使用 mongo 查询。

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(aggregation, "CustmObjects", Object.class);

我也尝试使用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

反正我得到的结果,数组的所有元素。 请帮忙!

【问题讨论】:

  • $elemMatch 投影在aggregate() 中不可用。请改用.find 变体,或$filter,正如您链接到的答案所示。
  • 我会在 9 小时内写完。现在不上班。它不适用于 Aggregate 和 ArrayOperators.Filter
  • 好的,最好实际展示您的尝试,以便我们可以指出您到底做错了什么。虽然我认为我之前确实将您链接到了 $filter 用法的 spring-mongo 实现。所以有点不确定你没有做对哪一部分。要么那个,要么我链接了错误的例子:(
  • @NeilLunn 我更新了。

标签: java mongodb spring-data-mongodb


【解决方案1】:

如果我正确理解了这个问题,这将给出预期的结果。

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);

【讨论】:

  • 这是一个列表,但问题是获取这个对象 - { "additionalDataId" : "id_1_2", "additionalDataName" : "name_1_2", "longText" : "关于危险的更长的故事.. 。” }
猜你喜欢
  • 2017-07-18
  • 1970-01-01
  • 2017-03-15
  • 2016-03-06
  • 2017-10-30
  • 2017-05-02
  • 2020-04-24
  • 2016-10-01
  • 2021-03-16
相关资源
最近更新 更多