gpt4 book ai didi

json - MongoDB,将对象数组更改为包含其 ObjectId 的字符串数组

转载 作者:行者123 更新时间:2023-12-05 03:51:13 26 4
gpt4 key购买 nike

我有一个数据库,里面装满了包含信息的对象,以及其他对象数组。我想将内部数组更改为仅将每个索引作为 ObjectId 类型及其各自的 ObjectId 的数组

我正在使用 mongoose populate 函数稍后在程序中检索此信息。所以引用只需要ObjectId。

job { 
_id: 1,
name: "name",
parts: [
{ _id: ObjectId("5c790ce7d3dc8d00ccc2688c"), name: "name"},
{ _id: ObjectId("5c790ce7d3dc8d00ccc2688b"), name: "name"},
{ _id: ObjectId("5c790ce7d3dc8d00ccc2688a"), name: "name"},
]
}

期望的结果

job {
_id: 1,
name: "name",
parts: [
ObjectId("5c790ce7d3dc8d00ccc2688c"),
ObjectId("5c790ce7d3dc8d00ccc2688b"),
ObjectId("5c790ce7d3dc8d00ccc2688a")
]
}

我从命令行尝试了一些 mongoDB 查询,但没有一个能完全给出我需要的结果。这个没有错误,但它似乎没有改变任何东西。

db.jobs.update(
{},
{
$set: {"parts.$[element]": "element._id"}
},
{
multi: true,
arrayFilters: [{ "element": {} }]
}
)

我不确定仅使用 mongo shell 是否可行。

最佳答案

引入了 Mongo v4.2 pipelined updates这允许在更新中使用聚合运算符,更重要的是使用它自己的值更新文档。这就是您想要实现的目标。

db.jobs.updateMany(
{},
[
{
'$set': {
'parts': {
'$map': {
'input': '$parts',
'as': 'part',
'in': '$$part._id'
}
}
}
}
]);

不幸的是,这对于早期的 Mongo 版本是不可能的。具体来说,$arrayFilters 允许您过滤数组,但在新的更新语法之前再次访问更新中自己的值是不可能的。

您必须遍历所有文档并在代码中逐一更新。

关于json - MongoDB,将对象数组更改为包含其 ObjectId 的字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63055651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com