【问题标题】:C# MongoDB driver - need simple code to read/query collectionC# MongoDB 驱动程序 - 需要简单的代码来读取/查询集合
【发布时间】:2017-05-23 20:25:57
【问题描述】:

我是 MongoDB 新手,我正在使用 C# 驱动程序,版本:v4.0.30319: 使用 MongoDB.Bson; 使用 MongoDB.Driver;

首先抱歉,这可能是一个简单的问题,我只是无法使用正确的搜索词正确找到我需要的东西来完成这项工作。

对于我的项目。我能够连接到数据库,获取所有集合的列表,并使用 ASYNC 循环遍历其中一个集合。我遇到的问题是试图找到示例来处理简单的事情,例如计数、限制或查找/获取特定记录。

大多数示例似乎是旧版本,然后我使用的以及我能找到的所有示例都需要 ASYNC。

这是我拥有的一个正在工作并返回数据的函数。

我希望能够拥有一个可以工作的函数,该函数将返回子数据集(使用查询)、获取计数和其他简单的事情。

我在集合中的数据是:

_id
RocketRequestID  int
LoanRocketID     int
RequestDate      date
CreatedByID      int
RequestXML       string/xml doc

我的功能是:

 static async Task<int>MainAsync()
    {

        int CountRecords = 0;

        var client = new MongoDatabaseConnection().mongoConn();

        IMongoDatabase db = client.GetDatabase("Viper");

        var collection = db.GetCollection<BsonDocument>("RocketRequest");            

        using (IAsyncCursor<BsonDocument> cursor = await collection.FindAsync(new BsonDocument()))
        {                
            while (await cursor.MoveNextAsync())
            {
                IEnumerable<BsonDocument> batch = cursor.Current;
                foreach (BsonDocument document in batch)
                {
                    Console.WriteLine(document);
                    Console.WriteLine();
                }
            }
        }// end using

        return CountRecords;

    }// end async 

同样,这可能很简单,我很抱歉,但感谢您提供的任何帮助。

【问题讨论】:

    标签: c# mongodb mongodb-query mongodb-.net-driver


    【解决方案1】:

    您可以创建一个对象来映射到您的收藏:

    public class RocketRequest
    {
        public string Id { get; set; }
        public int RocketRequestID { get; set; }
        public int LoanRocketID { get; set; }
    
        public DateTime RequestDate { get; set; }
    
        public int CreatedByID { get; set; }
    
        public string RequestXML { get; set; }
    }
    

    然后通过添加以下using 语句尝试使用 Linq

    using MongoDB.Driver.Linq;
    

    然后您可以编写更简单的查询,例如(例如)

    var collection = db.GetCollection<RocketRequest>("RocketRequest");   
    var count = collection.AsQueryable<Employee>()
                  .Count();
    

    【讨论】:

    • Alex,看起来不错,我认为 Linq 部分是我缺少的东西。你有一个问题: var count = collection.AsQueryable() .Count();我假设应该是 而不是 。我进行了更改,我能够得到计数,谢谢。
    • 我只需要添加查找,并循环遍历代码,但是通过向其中添加 Linq 的东西我可以解决这个问题。并用数据填充类
    【解决方案2】:

    你可以试试这样的:

        public async Task<Round> GetRound(int id)
        {
            IMongoCollection<Round> collection = m_db.GetCollection<Round>("Rounds");
            FilterDefinition<Round> filter = Builders<Round>.Filter.Eq("Round", id);
    
            return await collection.Find(filter).SingleOrDefaultAsync();
        }
    

    我通过Id执行过滤器,你也可以使用Count()方法代替SingleOrDefaultAsync(),当然,你需要改变你的返回类型。

        public async Task<long> GetRoundCount(int id)
        {
            IMongoCollection<Round> collection = m_db.GetCollection<Round>("Rounds");
            FilterDefinition<Round> filter = Builders<Round>.Filter.Eq("Round", id);
    
            return await Task.Run(() => collection.Find(filter).Count());
        }
    

    【讨论】:

      【解决方案3】:

      使用IFindFlient 检索您的数据:

      例如:

      var items = collection.Find(x => x.CreatedByID == 1).ToEnumerable()
      

      或者

      var itemsCount = collection.Find(x => x.RequestDate >= dateToSearch).Count()
      

      您可以使用 @Alex 的回答中建议的类和加载集合。很好地解释了如何创建集合对象和映射类:

      public class RocketRequest
      {
          public string Id { get; set; }
          public int RocketRequestID { get; set; }
          public int LoanRocketID { get; set; }    
          public DateTime RequestDate { get; set; }    
          public int CreatedByID { get; set; }    
          public string RequestXML { get; set; }
      }
      
      var collection = db.GetCollection<RocketRequest>("RocketRequest"); 
      

      【讨论】:

        猜你喜欢
        • 2012-03-04
        • 2012-09-02
        • 2012-05-15
        • 2017-07-14
        • 1970-01-01
        • 2017-07-09
        • 2016-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多