从其他集合中查找以特定数字开头的记录MongoDB

cczfrluj  于 2023-01-30  发布在  Go
关注(0)|答案(1)|浏览(157)

我有两个这样的系列:

发货_数据

{
    _id: ObjectId("63d19d7a1991a09011aa35ef"),
    sourcemmsi: 228051000,
    navigationalstatus: 0,
    course: {
      rateofturn: -127,
      speedoverground: 0,
      courseoverground: 291.5,
      trueheading: 511
    },
    coordinates: {
      longitude: -4.4850965,
      latitude: 48.38132,
      timestamp: 1443650424
    }
  }

源MMSI

{
    _id: ObjectId("63d19f671991a09011e4eba4"),
    mmsi_code: 228,
    country: 'France'
  }

第一个(Ship_Data)包含关于特定船只的信息,而第二个(SourceMMSI)显示源mmsi代码的前几位表示什么。例如,在我们的示例中,由于Ship_Data中的sourcemmsi字段以 228 开头,因此根据第二个集合,该船只可能来自法国。
我要完成的是使用这两个集合创建一个查询,并根据sourcemmsi字段的前三位数字返回记录。有没有什么方法可以完成这一点?

ccrfmcuu

ccrfmcuu1#

您可以通过$toString将代码转换为字符串(sourcemmsi在转换为字符串之前需要先额外转换为Long)。然后,使用$indexOfCP执行子串检查并查看索引是否为0。(即在sourcemmsi的开始)。

db.SourceMMSI.aggregate([
  {
    "$lookup": {
      "from": "Ship_Data",
      "let": {
        code: {
          "$toString": "$mmsi_code"
        }
      },
      "pipeline": [
        {
          $match: {
            $expr: {
              $eq: [
                0,
                {
                  "$indexOfCP": [
                    {
                      $toString: {
                        $toLong: "$sourcemmsi"
                      }
                    },
                    "$$code"
                  ]
                }
              ]
            }
          }
        }
      ],
      "as": "shipDataLookup"
    }
  }
])

Mongo Playground

相关问题