2016-03-07 57 views
3

我在Mongo中进行聚合,我无法获得预期的结果; 我想计数那些空列和那些非空,但显然 {“$ ne”:[“$ RequestedOn”,null]}总是如此。Mongo C#驱动程序与非空字段集合不过滤

我真的不知道问题出在哪里。 这是集合

/* 1 */ 
{ 
    "_id" : ObjectId("56cf03445667a09b17f661ef"), 
    "Name" : "User1 Test1", 
    "AccountRef" : "AccountRef1", 
    "Voucher" : "Voucher1",  
    "Email" : "[email protected]", 
    "CampaignId" : ObjectId("56c752d439bac5655eec7fb7") 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("56cf034c5667a09b17f661f0"), 
    "Name" : "User2 Test2", 
    "AccountRef" : "AccountRef2", 
    "Voucher" : "Voucher2", 
    "Email" : "[email protected]", 
    "CampaignId" : ObjectId("56c752d439bac5655eec7fb7") 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("56cf03565667a09b17f661f1"), 
    "Name" : "User3 Test3", 
    "AccountRef" : "AccountRef3", 
    "Voucher" : "Voucher3", 
    "GuidLink" : "7f079244-d94f-5e4a-8096-59b6df3ef64f", 
    "Email" : "[email protected]", 
    "CampaignId" : ObjectId("56c752d439bac5655eec7fb7") 
} 

/* 4 */ 
{ 
    "_id" : ObjectId("56cf035e5667a09b17f661f2"), 
    "Name" : "User4 Test4", 
    "AccountRef" : "AccountRef4", 
    "Voucher" : "Voucher4", 
    "Email" : "[email protected]", 
    "RequestedOn" : ISODate("2016-02-29T22:49:20.201Z"), 
    "CampaignId" : ObjectId("56c752d439bac5655eec7fb7") 
} 

的数据和我这是怎么构建查询

var wlUsers=Database.Collection; 
var cs = wlUsers.AsQueryable() 
.Where(wl => wl.CampaignId == id) 
.Select(p=> new { id = p.CampaignId, p.RequestedOn}) 
.GroupBy(wl => wl.id) 
.Select(g => new CampaignStatistics{ 
    ExistingCustomers = g.Count(),       
    TotalOrdered = g.Sum(w => w.RequestedOn.HasValue ? 1 :0), 
    LastOrder = g.Max(w => w.RequestedOn), 
    FirstOrder = g.Min(w => w.RequestedOn), 
    Last24hOrders = g.Sum(w => 
     w.RequestedOn > DateTime.Today.AddDays(-1)?1:0), 
}); 

结果是

{ 
    "ExistingCustomers" : 4, 
    "TotalOrdered" : 4, 
    "LastOrder" : ISODate("2016-02-29T22:49:20.201Z"), 
    "FirstOrder" : ISODate("2016-02-29T22:49:20.201Z"), 
    "Last24hOrders" : 4 
} 

但应

{ 
    "ExistingCustomers" : 4, 
    "TotalOrdered" : 1, 
    "LastOrder" : ISODate("2016-02-29T22:49:20.201Z"), 
    "FirstOrder" : ISODate("2016-02-29T22:49:20.201Z"), 
    "Last24hOrders" : 0 
} 

所以tota lOrdered必须是1和“Last24hOrders” = 0

而且我是新上蒙戈,所以我会很感激任何提示建议就如何建立这些预测

回答

1

我会怀疑这条线

 TotalOrdered = g.Sum(w => w.RequestedOn.HasValue ? 1 :0), 

尝试改变:

 TotalOrdered = g.Sum(w => (w.RequestedOn.HasValue && w.RequestedOn.Value > DateTime.Min) ? 1 :0) 
1

THX profesor79 我种分类的方式。这就是我的做法

var project = agg.Project(r => 
    new{ 
     id = r.CampaignId, 
     Last24H = r.RequestedOn.Value > DateTime.Today.AddDays(-1) ? 1 : 0, 
     HasRequested = (r.RequestedOn.Value > new DateTime() ? 1 : 0), //for some reason has value does not work (it is always true) 
     Date = r.RequestedOn}); 

var match = project.Match(p => p.id == id); 

var group = match.Group(
    r => r.id, 
    g => new CampaignStatistics{ 
      ExistingCustomers = g.Count(), 
      TotalOrdered = g.Sum(p => p.HasRequested), 
      LastOrder = g.Max(w => w.Date), 
      FirstOrder = g.Min(w => w.Date), 
      Last24HOrders = g.Sum(p => p.Last24H)}); 
相关问题