在java驱动聚合中使用mongo $toObjectId函数

问题描述 投票:0回答:1

我正在使用 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)

java mongodb aggregation-framework objectid
1个回答
0
投票

您正在添加一个字符串而不是一个对象。字符串

 "$toObjectId:\"$foreignKey\""
表示获取字段
toObjectId:"$foreignKey"
的值。由于该值丢失/未定义,因此“创建”字段也丢失/未定义。

创建一个具有名为

$toObjectId
字段和值
"$foreignKey"

的对象,而不是字符串
© www.soinside.com 2019 - 2024. All rights reserved.