假设我们有一个像这样的文档集合:
{
"_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
的引用?
答案 0 :(得分:2)
您可以预测carts.updatedon和updatedon的差异,然后从此聚合管道中筛选出结果。
calcArea = zipWith (*)
days = 3将过滤掉3天以上差异文件的结果。
我刚刚举例说明了如何使用$ subtract来查找日期差异并根据它来过滤文档。
答案 1 :(得分:1)
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变量。