我有许多文档,其中的架构如下所示,每个文档都包含(开始日期,结束日期),如以下架构所示。
是否有一种简单的方法来查找两个日期的交集并使用新键“ IntersectionDate”存储/更新同一文档????
//输入
{ //Main Document
"empid" : 1,"Aname" : "AmainDoc","Barray" : [ //BArray Start
{
"Bname" : "BsubDoc1","Bstartdate" : ISODate("2019-11-01T00:00:00.000Z"),"Benddate" : ISODate("2019-11-10T00:00:00.000Z"),"Carray" : [ //CArray Start
{
"Cname" : "CsubDoc1","Cstardate" : ISODate("2019-11-05T00:00:00.000Z"),"Cenddate" : ISODate("2019-11-15T00:00:00.000Z"),}
] //CArray End
},{
"Bname" : "BsubDoc2","Bstartdate" : ISODate("2019-11-11T00:00:00.000Z"),"Benddate" : ISODate("2019-11-20T00:00:00.000Z"),"Carray" : [ //CArray Start
{
"Cname" : "CsubDoc2","Cenddate" : ISODate("2019-11-10T00:00:00.000Z"),{
"Bname" : "BsubDoc3","Bstartdate" : ISODate("2019-11-21T00:00:00.000Z"),"Benddate" : ISODate("2019-11-30T00:00:00.000Z"),"Carray" : [ //CArray Start
{
"Cname" : "CsubDoc3","Cstardate" : ISODate("2019-11-01T00:00:00.000Z"),}
] //CArray End
}
] // BArray End
} // MainDocument End
我的第一个条件是
"Barray.Bname" = "BsubDoc1" and "Barray.Carray.Cname" = "CsubDoc1",
然后我要查找两个日期的交集并使用新键“ IntersectionDate”存储/更新同一文档
for e.g,Date1 : (Bstardate & Benddate) => (01-Nov-2019) & (10-Nov-2019)
Date2 : (Cstartdate & Cenddate) => (05-Nov-2019) & (15-Nov-2019)
So Find this=> IntersectionDate => (05-Nov-2019) & (10-Nov-2019)
and store/update same document with new key "IntersectionDate" : [05-Nov-2019,10-Nov-2019 ]
所以我想要这样的最终输出
{ //Main Document
"empid" : 1,"IntersectionDate" : [ISODate("2019-11-05T00:00:00.000Z"),ISODate("2019-11-10T00:00:00.000Z") ]
"Barray" : [ //BArray Start
{
"Bname" : "BsubDoc1",..........,},}
] // BArray End
} // MainDocument End
当我尝试对上述文档执行以下查询时,它会返回错误的路口日期。
db.getcollection('employee').aggregate([
{$match:{"Barray.Bname":"BsubDoc1","Barray.Carray.Cname":"CsubDoc1"}},{ $addFields: {
"max1": {
"$cond": {
if: { "$gt": ["$Barray.Bstartdate","$Barray.Carray.Cstardate"] },then: "$Barray.Bstartdate",else: "$Barray.Carray.Cstardate"
}
}}},{ $addFields: {
"min1": {
"$cond": {
if: { "$lt": ["$Barray.Benddate","$Barray.Carray.Cenddate"] },then: "$Barray.Benddate",else: "$Barray.Carray.Cenddate"
}
}
}},{$addFields:{"Intersection": {
"$cond": {
if: { "$lte": ["$max1","$min1"] },then: ["$max1","$min1"],else: "Not Overlap"
}}}},{$project:{_id:1,empid:1,max1:1,min1:1,"Intersection":1}}
]).forEach(function(doc){
//print(doc.empid)
db.employee.update( { empid: doc.empid },{$set:{IntersectionDate:doc.Intersection}} );
})
然后如何找到两个日期的交点?