我有一个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"
}
}
])