arrays - 如何使用吗啡过滤mongo文档中的嵌入数组

标签 arrays mongodb morphia

鉴于我的个人资料数据如下所示,我想找到 userName 和 productId 组合的个人资料 并且只返回带有该产品相应契约(Contract)的配置文件。

{
    "firstName": "John",
    "lastName": "Doe",
    "userName": "john.doe@gmail.com",
    "language": "NL",
    "timeZone": "Europe/Amsterdam",
    "contracts": [
        {
            "contractId": "DEMO1-CONTRACT",
            "productId": "ticket-api",
            "startDate": ISODate('2016-06-29T09:06:42.391Z'),
            "roles": [
                {
                    "name": "Manager",
                    "permissions": [
                        {
                            "activity": "ticket",
                            "permission": "createTicket"
                        },
                        {
                            "activity": "ticket",
                            "permission": "updateTicket"
                        },
                        {
                            "activity": "ticket",
                            "permission": "closeTicket"
                        }
                    ]
                }
            ]
        },
        {
            "contractId": "DEMO2-CONTRACT",
            "productId": "comment-api",
            "startDate": ISODate('2016-06-29T10:27:45.899Z'),
            "roles": [
                {
                    "name": "Manager",
                    "permissions": [
                        {
                            "activity": "comment",
                            "permission": "createComment"
                        },
                        {
                            "activity": "comment",
                            "permission": "updateComment"
                        },
                        {
                            "activity": "comment",
                            "permission": "deleteComment"
                        }
                    ]
                }
            ]
        }
    ]
}    

我设法找到了如何从命令行执行此操作的解决方案。但我似乎找不到使用 Morphia(最新版本)实现此目的的方法。

db.Profile.aggregate([
    { $match: {"userName": "john.doe@gmail.com"}},
    { $project: {
        contracts: {$filter: {
            input: '$contracts',
            as: 'contract',
            cond: {$eq: ['$$contract.productId', "ticket-api"]}
        }}
    }}
])

这就是我目前所拥有的。非常感谢任何帮助

Query<Profile> matchQuery = getDatastore().createQuery(Profile.class).field(Profile._userName).equal(userName);
getDatastore()
     .createAggregation(Profile.class)
     .match(matchQuery)
     .project(Projection.expression(??))

注意...同时我找到了另一种不使用聚合管道的解决方案。

    public Optional<Profile> findByUserNameAndContractQuery(String userName, String productId) {
        DBObject contractQuery = BasicDBObjectBuilder.start(Contract._productId, productId).get();
        Query<Profile> query =
                getDatastore()
                        .createQuery(Profile.class)
                        .field(Profile._userName).equal(userName)
                        .filter(Profile._contracts + " elem", contractQuery)
                        .retrievedFields(true, Profile._contracts + ".$");
        return Optional.ofNullable(query.get());
    } 

最佳答案

我终于找到了过滤嵌入式数组的最佳方法(假设我只想从数组返回最多 1 个元素)。

db.Profile.aggregate([
   { $match: {"userName": "john.doe@gmail.com"}},
   { $unwind: "$contracts"},
   { $match: {"contracts.productId": "comment-api"}}
])

关于arrays - 如何使用吗啡过滤mongo文档中的嵌入数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38196963/

相关文章:

python json 自定义解码 LONG

mongodb - Mongoose中sub docs和population的区别以及对数据库schema的疑惑

java - Morphia for Mongo DB 和低性能代码

c - 关于字符串比较 char* 和数组字符串的区别的解释

arrays - 如何将新值推送到 Mongoose 中的嵌套数组

node.js - 一个数据库,支持多区域应用

mongodb - 将 Java bean 和 Scala 案例类映射到 MongoDB 对象

javascript - Nodejs中的数组内存分配

php - 根据数据库值勾选复选框

MongoDB - 排序和限制范围查询时不使用索引