Springdata mongodb 聚合匹配

Geo*_*rey 2 spring mongodb mongodb-query aggregation-framework

在提出问题以了解更多 MongoDB 中的聚合框架后,我终于找到了满足我需要的聚合方法(感谢 StackExchange 用户)

所以基本上这里是我收藏的一个文件:

    {
        "_id" : ObjectId("s4dcsd5s4d6c54s6d"),
        "items" : [
            {
                type : "TYPE_1",
                text : "blablabla"
            },
            {
                type : "TYPE_2",
                text : "blablabla"
            },
            {
                type : "TYPE_3",
                text : "blablabla"
            },
            {
                type : "TYPE_1",
                text : "blablabla"
            },
            {
                type : "TYPE_2",
                text : "blablabla"
            },
            {
                type : "TYPE_1",
                text : "blablabla"
            }
        ]
        }
Run Code Online (Sandbox Code Playgroud)

这个想法是能够只过滤我的集合中的一些元素(避免类型 2 和 3)。事实上,我有超过 30 种类型,其中 6 种是不允许的,但为了简单起见,我做了这个例子。所以命令行中的聚合命令是这样的:

    db.history.aggregate([{
             $match: {
                 _id: ObjectId("s4dcsd5s4d6c54s6d")
             }
         }, {
             $unwind: '$items'
         }, {
             $match: {
                 'items.type': { '$nin': [ "TYPE_2" , "TYPE_3"] }
             }
         },
         { $limit: 10 }
     ]);
Run Code Online (Sandbox Code Playgroud)

有了这个,我可以检索此文档中不匹配的 10 个元素项,TYPE_2并且TYPE_3

但是,当我使用 spring 数据时,没有输出。我查看了构建我的示例,但它仍然无法正常工作。

所以我做了:

Aggregation aggregation = newAggregation(
    match(Criteria.where("id").is(myID)), 
    unwind("items"),
    match(Criteria.where("items.type").nin(ignoreditemstype)), 
    limit(3), 
    skip(offsetLong)
);

AggregationResults<PersonnalHistory> results = mongAccess.getOperation().aggregate(query,
            "items", PersonnalHistory.class);
Run Code Online (Sandbox Code Playgroud)

PersonnalHistory标有注释@Document(collection = "history")和ID与@id注解

ignoreditemstype是一个包含TYPE_2和的列表TYPE_3

这是我在toString聚合方法中的内容:

{ 
    "aggregate" : "__collection__" , 
    "pipeline" : [ 
        { "$match": { "id" : "s4dcsd5s4d6c54s6d"} }, 
        { "$unwind": "$items"},
        { "$match": { "items.type": { "$nin" : [ "TYPE_2" , "TYPE_3" ] } } }, 
        { "$limit" : 3}, 
        { "$skip" : 0 }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试了很多东西(至少有一个答案:)),比如删除 id 或 nin:

aggregation = newAggregation(
    unwind("items"),
    match(Criteria.where("items.type").nin(ignoreditemstype)), 
    limit(3), 
    skip(offsetLong)
);

aggregation = newAggregation(
    match(Criteria.where("id").is(myid)), 
    unwind("items")
);
Run Code Online (Sandbox Code Playgroud)

有关我执行简单查询时的信息,例如:

query.addCriteria(Criteria.where("id").is(myID));
Run Code Online (Sandbox Code Playgroud)

我的文件被退回。但是我有成千上万的项目。所以我只想先有 15 个(实际上第 15 个是最后添加的 15 个)

你可能看到我做错了什么吗?

Rah*_*mar 5

是的,看起来您正在传递简单的 String 而它正在期待 ObjectId

Aggregation aggregation = newAggregation(
    match(Criteria.where("_id").is(new ObjectId(myID))), 
    unwind("items"),
    match(Criteria.where("items.type").nin(ignoreditemstype)), 
    limit(3), 
    skip(offsetLong)
);
Run Code Online (Sandbox Code Playgroud)

现在的问题是为什么它适用于简单的查询,我的答案是因为 spring-data 驱动程序不是那么成熟,至少在聚合管道方面没有那么成熟。

  • 你用什么objectId?我在spring data的javadoc中找不到它。http://docs.spring.io/spring-data/data-mongo/docs/1.9.6.RELEASE/api/ (2认同)