【问题标题】:How to filter array in Mongodb document using Spring如何使用 Spring 过滤 Mongodb 文档中的数组
【发布时间】:2016-11-16 06:37:53
【问题描述】:

我有以下文档结构。

{
    "_id" : { "teacherId" : "<teacherId>", "Year" : "<Year>" },
    "groups" : [ {
        "groupId" : "<uuid>",
        "groupName" : "<name>",
        "groupNameLowerCase" : "<name_in_lower_case>",
        "description" : "<desc>",
        "students" : ["<studentid1>", "<studentid2>", ...],
        "editedDate" : "<currentTimestamp>"
        },
        ...
    ],
    "editedDate" : "<currentTimestamp>",
    "points" : "<points>"
}

考虑以下两个文档存在于 DB 中

{
    "_id" : { "teacherId" : "1", "Year" : "2016" },
    "groups" : [ {
        "groupId" : "123",
        "groupName" : "Test1",
        "groupNameLowerCase" : "test1",
        "description" : "sample document",
        "students" : ["11", "22"]
         },
    {
        "groupId" : "234",
        "groupName" : "Test2",
        "groupNameLowerCase" : "test2",
        "description" : "sample document",
        "students" : ["11", "22"]
         },
        {
        "groupId" : "345",
        "groupName" : "Test3",
        "groupNameLowerCase" : "test3",
        "description" : "sample document",
        "students" : ["21", "32"]
         }
    ],
    "points" : "650"
}

{
    "_id" : { "teacherId" : "1", "Year" : "2015" },
    "groups" : [ {
        "groupId" : "123",
        "groupName" : "HOCKEY",
        "groupNameLowerCase" : "HOCKEY",
        "description" : "HOCKEY team",
        "students" : ["11", "22"]
         },
        {
        "groupId" : "234",
        "groupName" : "football",
        "groupNameLowerCase" : "football",
        "description" : "sample football",
        "students" : ["11", "22"]
         },
        {
        "groupId" : "345",
        "groupName" : "Test3",
        "groupNameLowerCase" : "test3",
        "description" : "sample document",
        "students" : ["21", "32"]
         }
    ],
    "points" : "650"

我想为指定的学生和教师组合选择组。例如如果我提供teacherid= 1 和student id =11,那么查询应该返回两个具有匹配组的文档。我写了下面的代码来获取文档中的匹配组。但后来我明白 elemMatch 只会返回第一个元素匹配。它将返回两个文档,但其中只有一个组。

在这里,我想了解 Mongodb 2.4 中可用的选项来过滤某些查询返回的文档中的数组。

String teacherId = "1";
String studentId = "11";

Criteria documentSearchCriteria = where("_id.teacherId").is(teacherId)
                .and("groups")
                .elemMatch(where("students").in(studentId));

Criteria groupFilterCriteria = where("groups").elemMatch(where("students").in(studentBid));
BasicQuery query = new BasicQuery(documentSearchCriteria.getCriteriaObject(), groupFilterCriteria.getCriteriaObject());
List<GroupsDocument> groupsDocumentList = groupsMongoTemplate.find(query, GroupsDocument.class);

【问题讨论】:

    标签: mongodb spring-data spring-mongodb


    【解决方案1】:

    正如您所说,elemMatch 将仅检索数组中的第一个对象,因此您必须使用聚合未来来实现您的输出

        MatchOperation match = Aggregation.match(Criteria.where("_id.teacherId").is("1").and("groups.students").in(11));
        UnwindOperation unwind = Aggregation.unwind("groups");
        GroupOperation group = Aggregation.group("_id").push("groups").as("groups").first("points").as("points");
        Aggregation aggregation = Aggregation.newAggregation(unwind, match, group);
        AggregationResults<BasicDBObject> groupResults = mongoTemplate.aggregate(aggregation,
                        CustomGroupsDocument.class, BasicDBObject.class);
        List<BasicDBObject> result = groupResults.getMappedResults();
    

    【讨论】:

    • 你有什么例子吗
    猜你喜欢
    • 2013-02-13
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    相关资源
    最近更新 更多