当前位置: 首页 > 知识库问答 >
问题:

带有C#驱动程序的MongoDB-带有排序的日期格式

潘宝
2023-03-14

我需要将ISODate转换为字符串格式,如“2019-06-27”,并且还需要按日期对其进行排序。然而,我已经以所需的格式转换了日期,但由于日期字符串格式较早转换而混淆了日期排序。

应用环境

  1. 。NET MongoDB驱动程序-2.0
  2. MongoDB版本-3.2

以下是文档在MongoDB集合中的存储方式:

{ 
  "_id": "9d78d0e8-7b13-4487-88a3-d91d64f29b38",
  "Number": "001",
  .......,
  .......,
  "createdon": {
        "$date": "2019-09-19T00:00:00.000Z"
    },
  "modifiedon": {
        "$date": "2019-12-17T19:52:00.000Z"
    }
}

这是工作的C#函数,但没有日期排序:

public string GetData(Data.DataModel.TestModel model)
    {
        string collectionName = "testCollection";
        BsonDocument sort = new BsonDocument();
        BsonDocument match = new BsonDocument();
        BsonDocument project = new BsonDocument();

        int skip = model.skip;
        int limit = model.limit;

        try
        {                
            match.Add();

            project.AddRange(new BsonDocument { 

                                { "TDLNumber", 1 },
                                { "createdon", new BsonDocument("$dateToString", 
                                    new BsonDocument("format", "%Y-%m-%d").Add("date", "$createdon")) // format like 2019-06-27
                                },
                                { "modifiedon", new BsonDocument("$dateToString", 
                                new BsonDocument("format", "%Y-%m-%d").Add("date", "$modifiedon"))// format like 2019-06-27
                                }
                    });

            sort.AddRange(new BsonDocument { { "createdon", -1 }, { "modifiedon", -1 } });

            List<BsonDocument> lstReslut = dbo.FindAggDynQuery(collectionName, match, project, skip, limit, sort);
            QueryResult = lstReslut.ToJson();
        }
        catch (Exception)
        {
            QueryResult = "[]";
        }
        return QueryResult;
    }

但如果我没有日期转换,它的工作原理是这样的

 { "createdon", 1},
 { "modifiedon",1},
// { "createdon", new BsonDocument("$dateToString", 
//      new BsonDocument("format", "%Y-%m-%d").Add("date", "$createdon")) // format like 2019-06-27
// },
//{ "modifiedon", new BsonDocument("$dateToString", 
//      new BsonDocument("format", "%Y-%m-%d").Add("date", "$modifiedon"))// format like 2019-06-27
//}

下面是数据库层查询功能:

public List<BsonDocument> FindAggDynQuery(string collectionName, BsonDocument find, BsonDocument project, int skip, int limit, BsonDocument sort)
    {
        using (var connectionManager = new Test.Data.ConnectionManager())
        {
            var _collection = connectionManager.GetDBCollection(collectionName);
            var result = _collection.Find(find).Sort(sort).Project(project).Skip(skip).Limit(limit).ToListAsync().Result;
            return result;
        }
    }

这里出了什么问题。任何帮助都将不胜感激!!

共有1个答案

贺景铄
2023-03-14

在工作了几个小时后,以下是我的最佳答案。

使用Aggregate方法对GetData方法的更改:

match.Add();

project.AddRange(new BsonDocument { 

                            { "TDLNumber", 1 },
                            { "createdon", 1 },
                            { "modifiedon", new BsonDocument("$dateToString", 
                            new BsonDocument("format", "%Y-%m-%d").Add("date", "$modifiedon"))// format like 2019-06-27
                            }
                });

BsonDocument expAddfield = new BsonDocument(new BsonDocument("$addFields", new 
BsonDocument("createdon", new BsonDocument("$dateToString",
                                                                                                                        new BsonDocument
                                                                                                                        {
                                                                                                                            { "date", "$createdon" }, 
                                                                                                                            { "format", "%Y-%m-%d" }
                                                                                                                        }))));

sort.Add("createdon", -1);

List<BsonDocument> lstReslut= dbo.FindAggDynNoGroupWithSortSkipLimit(watertrackingCollection, expProject, match1, expAddfield, sort, skip, limit);

QueryResult = lstReslut.ToJson();

聚合方法

public List<BsonDocument> FindAggDynQuery(string collectionName, BsonDocument expProject, BsonDocument expMatch, BsonDocument expAddfield, BsonDocument expSort, int skip, int limit)
    {
        var connectionManager = new ez2Track.Data.ConnectionManager();
        var _collection = connectionManager.GetDBCollection(collectionName);
        var agg = _collection.Aggregate().Project(expProject).Match(expMatch).AppendStage<BsonDocument>(expAddfield).Sort(expSort).Skip(skip).Limit(limit);
        var result = agg.ToListAsync().Result;
        return result;
    }
 类似资料:
  • 我试图用Visual Studio生成以下示例C++代码: 我根据以下内容构建了驱动程序:https://github.com/mongodb/mongo-cxx-driver/blob/master/appveyor.yml 系统信息:-Win10-Visual Studio Community 2015 Update 3-使用Boost 1.60.0 64位-使用CMake 3.7.0-使用G

  • 我假设Selenium打开的chrome浏览会话将与google chrome本地安装相同。但是当我尝试在这个网站上搜索时,即使只是用selenium打开它并手动控制搜索过程,我会得到一个错误信息,当我使用常规chrome与我自己的个人资料或在incognito窗口中搜索结果返回良好。每当我搜索这个问题,我发现结果指出鼠标移动或点击模式提供它。但情况并非如此,因为我在打开浏览器后尝试手动控制。ht

  • 我有以下LINQ查询,这一个对我很有用 现在我需要的是排除一个月,即告诉查询不要向我显示1月和2月的月份。TallerDate包含一个列表的日期,即,在那个TallerDate中有几个日期为一月、二月和三月的记录。我在这个查询中所做的是将最低的月份(即一月和三月)带入f中,但这并不是必须的,正如我之前所说的,我需要的是TallerDate不显示一月和二月的月份,而是显示三月以后的月份

  • 在执行简单查询时,我有一个重复的查询。文件: someclass.java: someclassRepository.java: service.java: Application.Properties: 日志文件:

  • 我正在尝试使用MongoDBJava驱动程序作为聚合命令的一部分创建查询。目前我允许日期范围或特定日期数组作为参数。例如 日期范围查询工作正常,我解析xml并将其转换为在mongo中生成以下查询的DBObject; 对于指定日期,我只想返回在给定日期的00:00:00.000和第二天的00:00:00.000之间发生的结果。根据我对mongo查询的基本了解,我希望做一个类似于日期范围的$匹配,但是

  • 我已经准备了一些在Mongo上执行的脚本。它在命令行中按预期工作: 但是当我试图在java(scala)代码中移动它时,它不能与 有人成功使用db.eval()方法吗?