在mongodb中的聚合管道中展开操作后,查找阶段不起作用

阿里特拉·杜塔(Aritra Dutta)

在mongodb中相对较新,我对这三个表执行了聚合管道,并且令人惊讶的是,在管道的第三个查找阶段,我将“ r2”数组设置为空。我对字段名称进行了交叉检查,一切正常。

db.user.aggregate([
{
    $lookup:{
            from:"enrollment",
            localField:"user_id",
            foreignField:"userID",
            as:"r1"
        }
},

{
    $unwind:{
            path:"$r1",
            includeArrayIndex:"r1_id"
        }
},
{
    $lookup:{
            from:"course",
            localField:"r1.courseID",
            foreignField:"courseID",
            as:"r2"
        }
}
])

我作为用户,注册和课程有三个集合

用户身份

> db.user.find()
{ "_id" : ObjectId("5ef4ba8d500ac8876da0d2ca"), "user_id" : 1, "first_name" : "Christian", 
"last_name" : "Hur", "email" : "[email protected]", "password" : "abc1234" }
{ "_id" : ObjectId("5ef4ba8d500ac8876da0d2cb"), "user_id" : 2, "first_name" : "Mary", "last_name" : 
"Jane", "email" : "[email protected]", "password" : "password123" }
{ "_id" : ObjectId("5ef4bc2563742adee5403b1d"), "user_id" : 3, "first_name" : "ari", "last_name" : 
"dutta", "email" : "[email protected]", "password" : "po1234" }

并且,当然

> db.course.find()
{ "_id" : ObjectId("5ef4c1b64a77aec0af5e73ae"), "courseID" : 3333, "title" : "Adv PHP 201", 
"description" : "Advance PHP programming", "credits" : 3, "term" : "fall" }
{ "_id" : ObjectId("5ef4c20d4a77aec0af5e73af"), "courseID" : 5555, "title" : "Java 201", 
"description" : "Advanced Programming", "credits" : 4, "term" : "fall"}
{ "_id" : ObjectId("5ef4c2564a77aec0af5e73b0"), "courseID" : 6666, "title" : "Angular 1", 
"description" : "Intro to Angular", "credits" : 3, "term" : "fall,spring" }

和报名一样

> db.enrollment.find()
{ "_id" : ObjectId("5ef771f42d98ffab4460a651"), "userID" : 1, "courseID" : "3333" }
{ "_id" : ObjectId("5ef7722d2d98ffab4460a652"), "userID" : 1, "courseID" : "6666" }

结果

{ "_id" : ObjectId("5ef4ba8d500ac8876da0d2ca"), "user_id" : 1, "first_name" : 
"Christian", "last_name" : "Hur", "email" : "[email protected]", "password" : 
"abc1234", "r1" : { "_id" : ObjectId("5ef771f42d98ffab4460a651"), "userID" : 
1, "courseID" : "3333" }, "r1_id" : NumberLong(0), "r2" : [ ] }

{ "_id" : ObjectId("5ef4ba8d500ac8876da0d2ca"), "user_id" : 1, "first_name" : 
"Christian", "last_name" : "Hur", "email" : "[email protected]", "password" : 
"abc1234", "r1" : { "_id" : ObjectId("5ef7722d2d98ffab4460a652"), "userID" : 
1, "courseID" : "6666" }, "r1_id" : NumberLong(1), "r2" : [ ] }

我也检查了文档,但没有帮助,如何解决?

汤姆·斯拉伯特

你有一种不对齐courseID的集之间,在enrollment它的类型stringcourse它的类型number

更改$lookup为:

  {
    $lookup: {
      from: "course",
      let: {
        courseID: {
          $toInt: "$r1.courseID"
        }
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$$courseID",
                "$courseID"
              ]
            }
          }
        }
      ],
      as: "r2"
    }
  }

自己尝试:Mongo Playground

另外,由于您说的是新手,因此我个人建议您使用该_id字段,而不要使用自己生成courseID/ user_id它只会使维护更容易。

对于Mongo 4.2+版本,以下是如何更新注册收集字段:

db.enrollment.updateMany(
    {},
    [
        {
            $set: {
                courseID: {$toInt: "$courseID"}
            }
        }
    ]
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章