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

时间:2018-11-14 16:08:14

标签: mongodb

我有一个对象任务,它用键_p_position引用了另一个对象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",
    },
  },
])

但是我需要从Position$中删除_p_position。在用于查找匹配的Position的ID之前,有什么方法可以计算"_p_position"? PS:我只有DB的阅读权限

1 个答案:

答案 0 :(得分:1)

您可以使用$addFields添加另一个字段,然后将其传递到$lookup阶段。要获得跟随美元符号的部分,您需要:$indexOfBytes$substr运算符。另外,美元符号本身是Aggregation Framework中的特殊字符(表示字段引用),因此您需要$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" 
        }
    }
])