使用不匹配值的$lookup的Mongo聚合对象



我有一个Object Mission,它引用了另一个带有关键字_p_position的Object Position。

任务对象看起来像:

{
  _id: "ijjn97678",
  _p_position: "Position$qwerty123",
  ...
}

位置对象看起来像:

{
  _id: "qwerty123",
  ...
}

我不知道这是Mongo还是Parse约定,但可以看到在任务中的关系位置属性上添加了Position$

我想将两者聚合到一个对象中,以获得类似于以下的结果:

{
  _id: "ijjn97678",
  _p_position: "Position$qwerty123",
  positions: [
    {
      _id: "qwerty123"
    }
  ]
}

使用:

missions.aggregate([
  {
    $lookup: {
      as: "position",
      from: "Position",
      foreignField: "_id",
      localField: "_p_position",
    },
  },
])

但是我需要从_p_position中删除Position$。有没有一种方法可以在"_p_position"用于查找匹配的Position的id之前计算它?附言:我只有DB 的阅读权限

您可以使用$addFields添加另一个字段,然后将其传递到$lookup阶段。要获得美元符号后面的部分,您需要:$indexOfBytes和$substr运算符。此外,美元符号本身是聚合框架中的一个特殊字符(表示字段引用(,因此您需要$literal来强制将其视为常规字段

db.missions.aggregate([
    {
        $addFields: {
            value: {
                $let: {
                    vars: { index: { $indexOfBytes: [ "$_p_position", { $literal: "$" } ]  } },
                    in: { $substr: [ "$_p_position", { $add: [ "$$index", 1 ] } , { $strLenBytes: "$_p_position" } ] }
                }
            }
        }
    },
    {
        $lookup: {
            from: "Position",
            localField: "value",
            foreignField: "_id",
            as: "position" 
        }
    }
])

最新更新