Mongodb 使用$addFields将_id设置为新的UUID

Mongodb 使用$addFields将_id设置为新的UUID,mongodb,mongodb-query,aggregation-framework,uuid,Mongodb,Mongodb Query,Aggregation Framework,Uuid,有人搞错了。不是我,但我得把它修好。我需要做的是用新的UUID替换集合中每个文档的\u id 我的计划是聚合整个集合,使用$addFields替换\u id,然后将其合并回自身,替换记录。幸运的是,我可以使用一个辅助(复合)键进行合并,所以我在这方面做得很好——我想,因为我还没有做到这一点 我面临的问题是在$addFields阶段生成一个唯一的UUID(这就是问题的关键) db.foo.agregate([ { $addFields:{ //我真的只需要UUID字符串本身,因此需要拆分 “_id

有人搞错了。不是我,但我得把它修好。我需要做的是用新的UUID替换集合中每个文档的
\u id

我的计划是聚合整个集合,使用
$addFields
替换
\u id
,然后将其合并回自身,替换记录。幸运的是,我可以使用一个辅助(复合)键进行合并,所以我在这方面做得很好——我想,因为我还没有做到这一点

我面临的问题是在
$addFields
阶段生成一个唯一的UUID(这就是问题的关键)

db.foo.agregate([
{
$addFields:{
//我真的只需要UUID字符串本身,因此需要拆分
“_id”:UUID().toString().split(”)[1]
}
}
//这里是合并的地方
])
这里的问题是,
UUID()
只被调用一次,所以我得到了所有相同的ID。这不是我想要的

现在单调乏味的方法是从循环中一个接一个地完成这项工作。但是有没有一种方法可以从聚合管道中一次性完成这项工作呢



现在我发现我问的问题基本上是一样的,但问题的解决方法是不使用UUID,而是使用顺序键,所以这并不是我问题的答案。

如果你需要做的是

我需要做的是用新的UUID替换集合中每个文档的_id

…您可以使用ObjectID而不是UUID,然后:

  • 投影出_id
  • 美元投入新的收藏
服务器应该在插入过程中为每个文档生成新的_id

然后:

  • 删除原始集合
  • 将新集合重命名为原始名称

因此,这个答案只是通过从a调用
UUID()
来生成唯一的
UUID
s。尝试以下方法:

db.collectionName.aggregate([
{
$addFields:{
_身份证:{
$function:{
正文:函数(){
返回UUID().toString().split(“”)[1];
},
args:[],
朗:“js”
}
}
}
}
])
顺便说一句,它只能在MongoDB版本>=4.4中工作。 输出:

/*1*/
{
“_id”:“5dc9316a-50a8-4013-8090-06fc66cdce9f”,
“虚拟”:“数据”
},
/* 2 */
{
“_id”:“062ebc8f-4455-4a81-a9e0-34f6c7132cab”,
“虚拟”:“数据”
},
/* 3 */
{
“_id”:“94eef4b8-9c0e-4910-a1cb-58443a63a036”,
“虚拟”:“数据”
}

是的,我想到了,但不幸的是它们需要是UUID。完成后,应用转换将ObjectID转换为UUID?是的,就是这样!创建一个返回UUID的函数是实现它的诀窍;生成UUID并不奇怪,但都一样。这就解决了问题。