假设我们有一个像这样的文档集合:

{
    "_id" : ObjectId("591c54faf1c1f419a830b9cf"),
    "fingerprint" : "3121733676",
    "screewidth" : "1920",
    "carts" : [
        {
            "cartid" : 391796,
            "status" : "New",
            "cart_created" : ISODate("2017-05-17T13:50:37.388Z"),
            "closed" : false,
            "items" : [
                {
                    "brandid" : "PIR",
                    "cai" : "2259700"
                }
            ],
            "updatedon" : ISODate("2017-05-17T13:51:24.252Z")
        },
        {
            "cartid" : 422907,
            "status" : "New",
            "cart_created" : ISODate("2017-10-23T08:57:06.846Z"),
            "closed" : false,
            "items" : [
                {
                    "brandid" : "PIR",
                    "cai" : "IrHlNdGtLfBoTlKsJaRySnM195U"
                }
            ],
            "updatedon" : ISODate("2017-10-23T09:46:08.579Z")
        }
    ],
    "createdon" : ISODate("2016-11-08T10:29:55.120Z"),
    "updatedon" : ISODate("2017-10-23T09:46:29.486Z")
}

如何仅提取$ .carts数组中没有$ .carts.closed设置为true且$.carts.updatedon大于$.updatedon减去3天的文档?

我知道如何找到所有文档,其中数组中没有项目满足条件$and: [closed: {$eq: true}, {updatedon: {$gt : new ISODate("2017-10-20T20:15:31Z")}}]
但是,如何引用父元素$.updatedon进行比较?

在普通的mongodb shell查询语言中,它会有所帮助。

但是我实际上是使用C#驱动程序访问它的,所以我的查询过滤器是这样的:
FilterDefinition<_visitorData> filter;
filter = Builders<_visitorData>.Filter
  .Gte(f => f.updatedon, DateTime.Now.AddDays(-15));
filter = filter & (
  Builders<_visitorData>.Filter
    .Exists(f => f.carts, false)
      | !Builders<_visitorData>.Filter.ElemMatch(f =>
        f.carts, c => c.closed && c.updatedon > DateTime.Now.AddDays(-15)
      )
);

如何用对文档根元素DateTime.Now.AddDays(-15)的引用替换updatedon

最佳答案

您可以预测carts.updatedon和Updatedon的差异,然后从此聚合管道中过滤出结果。

coll.aggregate([{'$unwind':'$carts'},
                {'$match':{'closed':{'$ne':true}}},
                {'$project':{'carts.cartid':1,'carts.status':1,'carts.cart_created':1,'carts.closed':1,'carts.items':1,'carts.updatedon':1,'updatedon':1,'diff':{'$subtract':['$carts.updatedon','$createdon']}}},
                {'$match': {'diff': {'$gte': 1000 * 60 * 60 * 24 * days}}}])

days = 3将筛选出超过3天差异文档的结果。

我刚刚给出了一个示例,说明如何使用$ subtract查找日期差并基于此过滤文档。

10-08 09:46