MongoDB Aggregation命令转换为Java代码 [英] MongoDB Aggregation command to Java code

查看:320
本文介绍了MongoDB Aggregation命令转换为Java代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的mongodb shell命令:

This is my mongodb shell command:

db.dais_employee.aggregate([
    { 
        "$redact": {
            "$cond": {
                "if": {
                    "$gt": [
                        { "$subtract": [ "$modifiedon", "$createdon" ] },
                        1000 * 60 * 60 * 24
                    ]
                },
                "then": "$$KEEP",
                "else": "$$PRUNE"
            }
        }
    }
])

效果很好.

我需要在Java中使用此MongoDB命令,并且需要有关将MongoDB Aggregation框架与Java驱动程序配合使用的帮助.

I need to work this MongoDB command in java and I need help for using MongoDB Aggregation framework with java driver.

当我尝试使用Java驱动程序运行此命令时:

When I am trying to run this command using java driver:

AggregateIterable<Document> iterable = collection.aggregate(asList(
    new Document("$redact", 
         new Document("$cond", 
             new Document("if", 
                 new Document("$gt",
                      asList(new Document("$subtract",
                          asList("$modifiedon", "$createdon")
                      ),1000 * 60 * 60 * 24)
              ).append("then", "$$KEEP")
               .append("else", "$$PRUNE")
             )
         )
     )
));

会引发异常,

Exception in thread "main" com.mongodb.MongoCommandException: Command failed with error 15990: 'exception: this object is already an operator expression, and can't be used as a document expression (at 'then')' on server 192.168.1.127:27017. The full response is { "errmsg" : "exception: this object is already an operator expression, and can't be used as a document expression (at 'then')", "code" : 15990, "ok" : 0.0 }
    at com.mongodb.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:115)
    at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:114)
    at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:159)
    at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286)
    at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:173)
    at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:215)
    at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:206)
    at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:112)
    at com.mongodb.operation.AggregateOperation$1.call(AggregateOperation.java:227)
    at com.mongodb.operation.AggregateOperation$1.call(AggregateOperation.java:223)
    at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:239)
    at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:212)
    at com.mongodb.operation.AggregateOperation.execute(AggregateOperation.java:223)
    at com.mongodb.operation.AggregateOperation.execute(AggregateOperation.java:65)
    at com.mongodb.Mongo.execute(Mongo.java:772)
    at com.mongodb.Mongo$2.execute(Mongo.java:759)
    at com.mongodb.OperationIterable.iterator(OperationIterable.java:47)
    at com.mongodb.OperationIterable.forEach(OperationIterable.java:70)
    at com.mongodb.AggregateIterableImpl.forEach(AggregateIterableImpl.java:117)
    at threadpack.queryBtDates.main(queryBtDates.java:88)

帮助我找出错误,或提供正确的代码以使用Java驱动程序运行此命令.

Help me to find out the error, or give correct code to run this command using java Driver.

推荐答案

asList("$modifiedon",1000)应该为asList("$modifiedon","$createdon").

完成编辑后.可以看到问题是您将"then"和"else"附加到"$ gt"文档而不是"if".

As you have done the edit. Can see that the problem is you are appending the "then" and "else" to the "$gt" document rather than "if".

所以代替:

AggregateIterable<Document> iterable = collection.aggregate(

asList( new Document("$redact", 
         new Document("$cond", 
             new Document("if", 
                 new Document("$gt",
                      asList(new Document("$subtract",
                          asList("$modifiedon", "$createdon")
                      ),1000 * 60 * 60 * 24)
              ).append("then", "$$KEEP")
               .append("else", "$$PRUNE")
             )
         )
     )
)); 

您应该这样做:

AggregateIterable<Document> iterable = collection.aggregate(

asList( new Document("$redact", 
         new Document("$cond", 
             new Document("if", 
                 new Document("$gt",
                      asList(new Document("$subtract",
                          asList("$modifiedon", "$createdon")
                      ),1000 * 60 * 60 * 24)
              )
             ).append("then", "$$KEEP")
               .append("else", "$$PRUNE")
         )
     )
));

这篇关于MongoDB Aggregation命令转换为Java代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆