c# - 如何在 Mongodb 的聚合框架中编写日期范围查询?

标签 c# mongodb aggregation-framework

我的目标是使用 mongodb 2.2 和最新的 c# 驱动程序根据日期范围执行匹配和分组。

我在使用日期时间的聚合框架中创建匹配查询时遇到问题。我不知道我的数据类型是否不正确(poco 有一个日期时间并且对象在保存时是 utc)或者查询是否不正确,这更有可能。

//Here is the doc format that I'm querying:

  {
      "DateTime" : new Date("2/20/2013 17:29:03"),
      "DateTimeString" : "20130220", 
      "PurchaseAmount" : 1.91, 
      "ProductId" : "51293ac844da932e941fa2c4",
      "_id" : "20130220/51293ac844da932e941fa2c4"
    } 

//这是我正在尝试的聚合查询

    var timeStamp = DateTime.UtcNow.AddDays(-20);
    var startDate = timeStamp.Date;
    var endDate = timeStamp.AddDays(1).Date;

 var match = new BsonDocument 
                { 
                    { 
                        "$match", 
                        new BsonDocument 
                            { 
                               { "ProductId" ,  "51293ac844da932e941fa2c4"} 
                            }
                    } 
                };
            var match2 = new BsonDocument 
                { 
                    { 
                        "$match", 
                        new BsonDocument 
                            {  
             ***              { "$gte" ,  new BsonDocument{{"DateTime", timeStamp}} } //,
             ***                 // { "$lt" ,  endDate}
                            }
                    } 
                };

            var group = new BsonDocument 
                { 
                    { "$group", 
                        new BsonDocument 
                            { 
                                { "_id",  new BsonDocument 
                                        { 
                                           { "ProductId" ,  "$ProductId"}
                                           ,{ "DateTime" ,  "$DateTime"  }
                                        }   

                                }, 
                                { 
                                    "AvgOrder", new BsonDocument 
                                                 { 
                                                     { "$avg", "$PurchaseAmount" } 
                                                 } 
                                } 
                            } 
                  } 
                };

  var pipeline = new[] { match, match2, group };
            var aggregateResult = dbSession.GetCollection<RecentOrders>().Aggregate(pipeline);

请参阅*。我想提供特定的时间范围并计算该客户在该时间间隔内(按分钟、小时或天范围)的平均订单。我相信除了日期范围查询部分 (match2) 之外我可以正常工作。我认为问题是新 BsonDocuments 和查询的巧妙组合。如果您能提供帮助,非常感谢!

最佳答案

您已经在 match2 中交换了东西。它应该是这样的:

var match2 = new BsonDocument 
    {{ "$match", new BsonDocument 
        {{ "DateTime", new BsonDocument {
            {"$gte", timeStamp},
            {"$lt", endDate}
        }}}
    }};

关于c# - 如何在 Mongodb 的聚合框架中编写日期范围查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15089958/

相关文章:

ruby-on-rails - Mongoid embeds_many 和 has_many 到同一个模型

c# - 这个 getter 每次被引用时都会调用数据库吗?

c# - 将 List<string> 绑定(bind)到 TextBox

c# - 扩展 IEnumerable 的选择以在选择器中包含源

MongoDb更新原子性

python - 我如何在 Python/Flask 中干净地做 slugs?

c# - MySql.Data 和 C#

mongodb - 如何在 $group 阶段后返回所有字段而不指定

mongodb - 子数组中的对象在 mongodb 中过滤查询

mongodb - 计算子文档数组中的唯一元素