查找数组中的元素的值是否等于父元素值

时间:2017-10-24 16:42:43

标签: c# mongodb-query

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

{
    "_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的引用?

2 个答案:

答案 0 :(得分:2)

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

calcArea = zipWith (*)

days = 3将过滤掉3天以上差异文件的结果。

我刚刚举例说明了如何使用$ subtract来查找日期差异并根据它来过滤文档。

答案 1 :(得分:1)

好吧,几天前我处于类似情况。 我使用Newjectoft.Json的Jobject解决了这个问题。 创建一个函数来返回实际处理每个文档的bool,将其作为输入。

  Jobject jOb=Jobject.parse(<Your document string>);
  JArray jAr=JArray.Parse(jOb["carts"]);
  If(jOb["updateon"]=<Your Business Validation>)
  {
     foreach(var item in jAr)
       if(item["closed"]==<Your validation>){ return true}         

   }
 return false;

我希望这有帮助:) 如果您使用这些属性中的任何空值处理,请使用Tryparse和out变量。