我有一个对象任务,它用键_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的阅读权限
答案 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"
}
}
])