wushigejiajia01
V2EX  ›  Java

[求助] Java 操作 mongodb

  •  
  •   wushigejiajia01 · Nov 24, 2020 via Android · 3283 views
    This topic created in 1998 days ago, the information mentioned may be changed or developed.

    db.chat_message.aggregate([

    {
    
        $match: {
    
            "sessionId":{$in: ["1249264194773536859"]}, 
    
            "channel": 3,
    
            "senderType": 2
    
        }
    
    },
    
    {
    
        $group: {
    
            _id: {
    
                sessionId: "$sessionId",
    
                targetId: "$targetId"
    
            },
    
            count: { $sum: 1 }
    
        }
    
    },
    
    {
    
        $match: {
    
            tcount: { $gt: 2 }
    
        }
    
    },
    
    {
    
        $group: {
    
            _id: {
    
                targetId: "$_id.targetId"
    
            },
    
            count: { $sum: 1}
    
        }
    
    },
    
    {
    
        $group: {
    
            _id: null,
    
            count: {$sum: 1}
    
        }
    
    }
    

    ])

    第一次搞 mongdb,还是这种多重分组的,要用 java 代码实现,网上找了一些教程看了,但是最后还是不行,没法了厚脸皮来求助

    Supplement 1  ·  Nov 25, 2020
    其实最初想用下面这个方式去实现的:

    Aggregation agg = newAggregation(
    match(new Criteria().andOperator(Criteria.where("sessionId").in(sessionIdList),
    Criteria.where("channel").is(3), Criteria.where("senderType").is(2))),
    group("sessionId" ,"targetId").count().as("count"),
    match(new Criteria("count").gt(2)),
    group("null").count().as("threeCount")
    );

    但是不会用, 而且这里应该还是错的,
    最终没法, 用了跟 1 楼类似的方式去实现了

    求问哪位大佬, 能帮忙看看用这样的方式怎么写吗?
    11 replies    2020-11-25 22:58:58 +08:00
    narmgalaxy
        1
    narmgalaxy  
       Nov 24, 2020   ❤️ 2
    // Requires official Java MongoDB Driver 3.6+
    import com.mongodb.Block;
    import com.mongodb.MongoClient;
    import com.mongodb.MongoException;
    import com.mongodb.client.MongoCollection;
    import com.mongodb.client.MongoDatabase;
    import java.util.Arrays;
    import java.util.List;
    import org.bson.BsonNull;
    import org.bson.Document;
    import org.bson.conversions.Bson;

    public class Program {

    public static void main(String[] args) {

    try (MongoClient client = new MongoClient("localhost", 27017)) {

    MongoDatabase database = client.getDatabase("bijiduo");
    MongoCollection<Document> collection = database.getCollection("docInfo");

    // Created with Studio 3T, the IDE for MongoDB - https://studio3t.com/

    Block<Document> processBlock = new Block<Document>() {
    @Override
    public void apply(final Document document) {
    System.out.println(document);
    }
    };

    List<? extends Bson> pipeline = Arrays.asList(
    new Document()
    .append("$match", new Document()
    .append("sessionId", new Document()
    .append("$in", Arrays.asList(
    "1249264194773536859"
    )
    )
    )
    .append("channel", 3.0)
    .append("senderType", 2.0)
    ),
    new Document()
    .append("$group", new Document()
    .append("_id", new Document()
    .append("sessionId", "$sessionId")
    .append("targetId", "$targetId")
    )
    .append("count", new Document()
    .append("$sum", 1.0)
    )
    ),
    new Document()
    .append("$match", new Document()
    .append("tcount", new Document()
    .append("$gt", 2.0)
    )
    ),
    new Document()
    .append("$group", new Document()
    .append("_id", new Document()
    .append("targetId", "$_id.targetId")
    )
    .append("count", new Document()
    .append("$sum", 1.0)
    )
    ),
    new Document()
    .append("$group", new Document()
    .append("_id", new BsonNull())
    .append("count", new Document()
    .append("$sum", 1.0)
    )
    )
    );

    collection.aggregate(pipeline)
    .allowDiskUse(false)
    .forEach(processBlock);

    } catch (MongoException e) {
    // handle MongoDB exception
    }
    }

    }
    0x9527
        2
    0x9527  
       Nov 24, 2020 via Android
    tcount: { $gt: 2 } ?
    wushigejiajia01
        3
    wushigejiajia01  
    OP
       Nov 24, 2020 via Android
    @0x9527 这个是手抖,弄错了,多了个 t
    wushigejiajia01
        4
    wushigejiajia01  
    OP
       Nov 24, 2020 via Android
    @narmgalaxy 感谢😘😚😗😙

    我晚上后来自己也拼出来了🤣
    wushigejiajia01
        5
    wushigejiajia01  
    OP
       Nov 25, 2020
    @narmgalaxy

    大佬 你这个是用 studio 3T 生成的吗? 格式好像

    但是我记得这个是只能用 SQL 生成 Java 代码吧?
    咋用 mongo shell 生成 java 代码啊?
    narmgalaxy
        6
    narmgalaxy  
       Nov 25, 2020
    我这个是自动生成的。用的 studio 3t.
    narmgalaxy
        7
    narmgalaxy  
       Nov 25, 2020
    @wushigejiajia01 不是好像,这个就是。
    wushigejiajia01
        8
    wushigejiajia01  
    OP
       Nov 25, 2020
    @narmgalaxy
    好吧 我说看着格式怪眼熟

    可是 我用的版本好像只有从 SQL 生成 Java 代码, 没有从 shell 生成代码的

    你这个是咋弄的?
    我的版本不对吗
    我的是 2019.2.1(试用版)
    narmgalaxy
        9
    narmgalaxy  
       Nov 25, 2020   ❤️ 1
    我也是一样的版本。
    在 aggreagate 里操作,
    wushigejiajia01
        10
    wushigejiajia01  
    OP
       Nov 25, 2020
    @narmgalaxy
    哈哈
    我自己研究了下, 搞出来了
    我就想着赶紧过来回复你一下, 没想到你这么快就回复了

    哈哈 感谢
    qinxi
        11
    qinxi  
       Nov 25, 2020
    //match1
    final MatchOperation match = Aggregation.match(criteria);
    //group1
    final GroupOperation group1 = Aggregation.group("sessionId","targetId").count().as("count");
    //match2
    final MatchOperation match2 = Aggregation.match(new Criteria("count").gt(2));

    //group2
    Aggregation.group().count().as("count");

    final Aggregation aggregation = Aggregation.newAggregation(match1, group1,match2, group2);

    final Map uniqueMappedResult = mongoTemplate.aggregate(aggregation, UserTask.class, Map.class).getUniqueMappedResult();
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1040 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 18:31 · PVG 02:31 · LAX 11:31 · JFK 14:31
    ♥ Do have faith in what you're doing.