如何在MongoDB中查找两个日期的交集并使用新键“ IntersectionDate”存储/更新同一文档

我有许多文档,其中的架构如下所示,每个文档都包含(开始日期,结束日期),如以下架构所示。

是否有一种简单的方法来查找两个日期的交集并使用新键“ 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}} );
})

然后如何找到两个日期的交点?

gaohhxx2009 回答:如何在MongoDB中查找两个日期的交集并使用新键“ IntersectionDate”存储/更新同一文档

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3085152.html

大家都在问