我正在使用 Mongo java 驱动程序(版本 3.12.12)聚合来连接两个 MongoDB 集合。
左侧集合具有右侧集合的 _id 字段的字符串版本。以下是一些示例文档:
左集:
{ "foreignKey" : "5a43b24cb4eac10001dbafba"}
右集:
{ "_id" : ObjectId("5a43b24cb4eac10001dbafba", "rightsideField": "some right side stuff")}
我需要将
leftCollection.foreignKey
字符串转换为 ObjectIds
,以便我可以在稍后的 $lookup
阶段使用该 objectId 作为外键。我正在尝试使用 $toObjectId mongo 聚合函数来实现此目的。
这是执行此操作的代码:
Bson addForeignKeyObjectId = Aggregates.addFields(new Field("foreignKeyObjId", "$toObjectId:\"$foreignKey\""));
List<BsonDocument> foo = ImmutableList.copyOf(leftCollection.aggregate(
ImmutableList.of(
addForeignKeyObjectId,
)
))
我的期待:
{"foreignKey":"5a43b24cb4eac10001dbafba", "foreignKeyObjId":ObjectId("5a43b24cb4eac10001dbafba")}
我得到了什么:
{"foreignKey":"5a43b24cb4eac10001dbafba"}
请注意,未添加所需的
foreignKeyObjId
字段。 :(
但是,如果我将
$toObjectId
表达式替换为如下文字:
Bson addForeignKeyObjectId = Aggregates.addFields(new Field("foreignKeyObjId", "some bogus literal"));
新字段已正确添加,输出文档如下所示:
{"foreignKey":"5a43b24cb4eac10001dbafba", "foreignKeyObjId":"some bogus literal"}
因此,
addFields
聚合步骤似乎工作正常,但我怀疑我还没有完全正确地理解$toObjectId
表达式的语法。谁能告诉我这里正确的做法吗?
(我真的非常希望我们不使用 _ids 作为外键,使用这种方法一切都会变得更困难,但没有范围来改变这种丑陋 rn)
您正在添加一个字符串而不是一个对象。字符串
"$toObjectId:\"$foreignKey\""
表示获取字段 toObjectId:"$foreignKey"
的值。由于该值丢失/未定义,因此“创建”字段也丢失/未定义。
创建一个具有名为
$toObjectId
字段和值 "$foreignKey"
的对象,而不是字符串