如何在Java中对MongoDB按日期进行查询统计

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Java中对MongoDB按日期进行查询统计相关的知识,希望对你有一定的参考价值。

参考技术A 方法一:通过构造BasicDBObject对象来进行查询
[java] view plain copy
int startYear=2015,endYear=2016;
int startMonth=12,endMonth=1;
int startDay=1,endDay=1;
BasicDBObject query= new BasicDBObject("applydate", new BasicDBObject("$gte", new Date(startYear - 1900, startMonth - 1, startDay)).append("$lt", new Date(endYear - 1900, endMonth -1, endDay)));//因为无法确知当前月有多少天,所以就从当月的1号(包含)计到下月1号(不包含)
int iCount = cltApplies.find(query).count();
System.out.println(iCount);

经测试上述代码执行完毕后iCount为9。也就是在2016-1-1至2016-1-31期间有9条记录。
方法二:通过BasicDBObjectBuilder对象来查询:
[java] view plain copy
int startYear=2016,endYear=2016;
int startMonth=1,endMonth=2;
int startDay=1,endDay=1;
BasicDBObject query= new BasicDBObject();
query.put("applydate", BasicDBObjectBuilder.start("$gte", new Date(startYear - 1900, startMonth - 1, startDay)).add("$lt", new Date(endYear - 1900, endMonth - 1, endDay)).get());
int iCount = cltApplies.find(query).count();
System.out.println(iCount);

上述代码执行后iCount同样为9。

注意:因为java.util.Date(year,month,day)这个构造函数中year是超出1900的年数,所以需要减去1900;month从0开始,所以需要减去1。这个问题容易被初学者忽视。

下面扩展地说一下如果要进行带日期过滤条件的统计,该如何做。

前面的东西都相同,只是在统计的时候需要调用集合的distinct方法。如统计某个字段不重复的值有哪些,可用如下写法:

[java] view plain copy
int startYear=2016,endYear=2016;
int startMonth=1,endMonth=2;
int startDay=1,endDay=1;
BasicDBObject query= new BasicDBObject();
query.put("applydate", BasicDBObjectBuilder.start("$gte", new Date(startYear - 1900, startMonth - 1, startDay)).add("$lt", new Date(endYear - 1900, endMonth - 1, endDay)).get());
List<String> lstUserIds = cltApplies.distinct("userId", query);
System.out.println(lstUserIds.size());

上面这段代码的执行结果为4。也就是在2016-1-1至2016-1-31之间出现了4个不同的userId。

如何在 RecyclerView 中对字符串元素进行排序?

【中文标题】如何在 RecyclerView 中对字符串元素进行排序?【英文标题】:How to sort string elements in RecyclerView? 【发布时间】:2021-11-23 20:09:21 【问题描述】:

我在 RecyclerView 中有 5 个元素(取自 DB 的元素),其中包含日期和文本。两个不同的列表。对于日期和字符串。一个片段包含 1 个日期和 1 个字符串文本。所以,我需要按日期对元素进行排序,就像那样

我想要的结果

text1 10.09.2021
text2 13.09.2021
text3 30.09.2021
text4 1.12.2021

我得到的结果

text3 30.09.2021
text4 1.12.2021
text1 10.09.2021
text2 13.09.2021

文本和日期是两个不同的列表

问题是,我如何将日期排序为字符串(可能是?)而不会丢失文本,以及我应该在哪里执行此操作(从数据库获取之后和在适配器中检索数据之前?或加载元素之后在适配器中,然后让它们返回进行排序(看起来很糟糕)

这就是我如何从数据库中获取数据并在适配器中检索

        List<String> reminder = new ArrayList<>();
        List<String> date = new ArrayList<>();

        Calendar test = Calendar.getInstance();
        long pars = test.getTimeInMillis();
        System.out.println(pars);


        dbf.child("Reminders").addValueEventListener(new ValueEventListener() 
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) 

                reminder.clear();
                date.clear();


                for(DataSnapshot child2 : snapshot.getChildren())  // getting a data from DB to ArrayList for dropping into Adapter

                    for(DataSnapshot tChild : child2.getChildren()) 
                        if (tChild.getKey().equals("text")) 
                            reminder.add(tChild.getValue().toString());
                            rem = reminder.toArray(new String[reminder.size()]);

                        
                        if (tChild.getKey().equals("date")) 
                            date.add(tChild.getValue().toString());
                            dat = date.toArray(new String[date.size()]);


                        

                    



                    mainRowAdapter rAdapter = new mainRowAdapter(MainActivity.this, rem,dat);
                    rv.setAdapter(rAdapter);
                    rv.setLayoutManager(new LinearLayoutManager(MainActivity.this));

                
            

            @Override
            public void onCancelled(@NonNull DatabaseError error) 

            
        );

AdapterClass 中的setText

        holder.reminder.setText(reminder[position]);
        holder.date.setText(date[position]);

在另一个主题中,我看到了这个,但这对我的情况没有帮助吗?可能存在一些类比吗?

Collections.sort(categories, new Comparator<Categories>() 
            @Override
            public int compare(Categories lhs, Categories rhs) 
                return lhs.title.compareTo(rhs.title);
            
        );

【问题讨论】:

您介意重新表述您的问题吗?并且可能提供现有行为与预期行为的示例。 更新了我的问题 【参考方案1】:

对数据进行排序的最佳位置是当您通过查询从 db 获取数据时,但如果您想在列表中手动进行排序,保存日期的最佳格式如下:

2021.09.10
2021.09.13
2021.09.30
2021.12.01

因为字符串排序可以应用于您的日期。 要按降序对日期进行排序,您可以简单地使用:

collections.reverseorder();

【讨论】:

但是我怎样才能对我的文本数组进行排序呢?与日期的位置相同?

以上是关于如何在Java中对MongoDB按日期进行查询统计的主要内容,如果未能解决你的问题,请参考以下文章

(Python) 按日期查询,在 mongoDB 集合中存储为字符串

如何在 MongoDB 中按日期对集合进行排序?

如何在 SQL Server 中按日期列排序的组中对列进行排名

如何按创建日期删除 MongoDB 中的数据? [复制]

如何按创建日期删除 MongoDB 中的数据? [复制]

请求有关如何在一个查询中对多个条件的计数进行分组的帮助