MongoDB:在后续文档中具有相同集合的$ lookup

问题描述

我对MongoDB相对较新,我必须使用先前的sql结构切换处理特定数据的方式。因此,我确定执行的方法并不明智。

我有一份包含大量信息的工作合同清单。在那个级别上,它们不是按个人分组的。我想使用$lookup命令将每个合同(文档)与以下合同(如果它与同一个工作人员(个人)相关)链接

在原始.csv表中提供了一个名为“ ord_id”的特定字段,该字段对文档进行排序。上面的示例是我的收藏的简化版。这些条目指的是同一个'worker_id': 158250,但存在其他不同的人。

{
    "_id" : ObjectId("5f33a6bafdb40e7c44a4e663"),"worker_id" : "158250","employer" : "139998","start_date" : ISODate("2012-02-15T01:00:00.000+01:00"),"end_date" : ISODate("2012-04-17T02:00:00.000+02:00"),"ord_id" : 484
},{
    "_id" : ObjectId("5f33a6bafdb40e7c44a4e665"),"employer" : "5794265","start_date" : ISODate("2012-10-17T02:00:00.000+02:00"),"end_date" : ISODate("2012-11-15T01:00:00.000+01:00"),"ord_id" : 486
},{
    "_id" : ObjectId("5f33a6bafdb40e7c44a4e667"),"start_date" : ISODate("2013-06-01T02:00:00.000+02:00"),"end_date" : ISODate("2013-09-30T02:00:00.000+02:00"),"ord_id" : 488
},{
    "_id" : ObjectId("5f33a6bafdb40e7c44a4e666"),"start_date" : ISODate("2013-02-01T01:00:00.000+01:00"),"end_date" : ISODate("2013-05-31T02:00:00.000+02:00"),"ord_id" : 487
},{
    "_id" : ObjectId("5f33a6bafdb40e7c44a4e664"),"start_date" : ISODate("2012-03-12T01:00:00.000+01:00"),"end_date" : ISODate("2012-05-12T02:00:00.000+02:00"),"ord_id" : 485
},{
    "_id" : ObjectId("5f33a6bafdb40e7c44a4e668"),"start_date" : ISODate("2015-06-01T02:00:00.000+02:00"),"end_date" : ISODate("2015-11-30T01:00:00.000+01:00"),"ord_id" : 489
}

我想在每个文档中添加一个名为“ next”的新字段,该字段引用基于ord_id的以下合同。为此,我执行了以下命令:

db.mycollection.aggregate([
   { $sort: { ord_id: 1 } },{
      $lookup:
         {
           from: "mycollection",let: { id_lav: "$worker_id",curr_ord_id: "$ord_id" },// 'curr_' is for current
           pipeline: [
               { $match:
                 { $expr:
                    { $and:
                       [
                         { $eq: [ "$worker_id","$$id_lav" ] },{ $gt: [ "$ord_id","$$curr_ord_id" ] }
                       ]
                    }
                 }
              },{ $limit: 1 }
           ],as: "next"
         }
    },{ $unwind: { path: "$next",preserveNullAndEmptyArrays: true} },{ $out: "mycollection" } ],{ allowdiskUse: true } );

但是,肯定有一些我想念的东西。实际上,某些文档的“下一个”字段与下一个有效字段不匹配。例如,“ ord_id”等于484的文档将被链接到“ ord_id”等于486而不是485的文档。相反,其他文档则被正确链接。为了解决这个问题,我以这种方式对先前的代码做了一些修改

db.mycollection.aggregate([
   { $sort: { ord_id: 1 } },"$$curr_ord_id" ] },{ $eq: [ { $subtract: [ "$ord_id",1 ] },{ $or: [
                         { $eq: [ "$worker_id","$$curr_ord_id" ] } 
                         ] }
                       ]
                    }
                 }
              },{ allowdiskUse: true } );

我不完全理解为什么第一个命令没有给出期望的输出。尽管如此,我相信有更好的方法解决这个问题。任何建议表示赞赏。预先谢谢你!

解决方法

您首先是管道真的很近。主要问题是您必须在$sort$lookup,现在拥有的$sort是多余的(您可以保留它,因此新集合将在{{1}之后},因此,如果以后您在同一更新中运行$out,就不再需要。)

$sort

MongoPlayground