美文网首页
mongodb-driver中使用$cond

mongodb-driver中使用$cond

作者: 岑吾 | 来源:发表于2020-04-06 16:17 被阅读0次

需求

当在游戏金币变动日志中,金币有正有负,需要按玩家分别统计正值和负值的和时。可以使用$cond计算表达式

定义

$cond 计算 boolean 表达式以 return 两个指定的 return 表达式之一。mongodb语法:

{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] }

mongodb-driver实现

查询数据

如有玩家金币变动日志数据

{ "_id" : 1, "userId" : "12345", "change": 300 }
{ "_id" : 2, "userId" : "12345", "change": -200 }
{ "_id" : 3, "userId" : "12345", "change": 150 }
{ "_id" : 3, "userId" : "12311", "change": 250 }

mongodb实现

db.getCollection('CoinLog').aggregate({
$group: {
    _id: "$userId",
    win: {
            $sum: {
                    $cond: [{
                            $gt: ["$change", 0]
                        },"$change",0]
                }
            }
    }, 
    lose: {
            $sum: {
                    $cond: [{
                            $lt: ["$change", 0]
                        },"$change",0]
                }
            }
    }
})

mongodb-driver实现

这里用的mongodb-driver版本为3.8.2

BsonArray filter = new BsonArray();
filter.add(new BsonString("$change"));
filter.add(new BsonInt64(0));

BsonArray winCond = new BsonArray();
winCond.add(new BsonDocument("$gt", filter));
winCond.add(new BsonString("$change"));
winCond.add(new BsonInt64(0));

BsonArray loseCond = new BsonArray();
loseCond.add(new BsonDocument("$lt", filter));
loseCond.add(new BsonString("$change"));
loseCond.add(new BsonInt64(0));

db.getCollection('CoinLog')
    .aggregate(Arrays.asList(
        Aggregates.group($userId,
                    sum("win",new BsonDocument("$cond",winCond)),
                    sum("lose",new BsonDocument("$cond",loseCond)))
            )).forEach(new Block<Document>() {
            @Override
            public void apply(Document doc) {
                String userId = doc.getString("_id");
                // 这里要注意一下的是,如果累加值过大,
                // 需要先判断类是是int还是long,不然直接getInteger会出错
                int win = doc.getInteger("win");
                int lose = doc.getInteger("lose");
                // TODO 
            });

相关文章

  • mongodb-driver中使用$cond

    需求 当在游戏金币变动日志中,金币有正有负,需要按玩家分别统计正值和负值的和时。可以使用$cond计算表达式 定义...

  • Java使用SSH连接MongoDB

    一、环境 在Java中可以使用mongodb-driver和com.jcraft来实现Java中使用SSH连接Mo...

  • 互斥锁的使用

    pthread_mutex_t _mutexpthread_cond_t _cond 条件锁需要和互斥锁配合使用,...

  • aqs中condition的实现

    condition使用场景 condition条件变量的使用,看起来和操作系统中的pthread_cond很像,又...

  • 锁的几个易错点

    1、禁止使用高层并发对象的内置锁 实现java.util.concurrent.locks包中的Lock或Cond...

  • 通过@ConditionalOnProperty来控制Confi

    SpringBoot基础篇Bean之条件注入@Condition使用姿势 [springBoot----@Cond...

  • pthread中mutex和cond的配合使用

    典型的生产者,消费者多线程并发模型中,cond一般要和mutex配合使用,如下: 1.生产者:pthread_mu...

  • ignore.py

    2021年9月26日17:19:29 星期日if cond1 elif cond2, cond1 和 cond2...

  • goland cond数据结构学习

    1、cond结构介绍 2、cond方法介绍 3、代码示例 5、应用场景 限流器 参考:类库dropbox中,rat...

  • 2017-06-15

    st=>start: Start op=>operation: Your Operation cond=>cond...

网友评论

      本文标题:mongodb-driver中使用$cond

      本文链接:https://www.haomeiwen.com/subject/fvjbphtx.html