gpt4 book ai didi

mongodb - 如何将一个 ObjectIds 数组转换为一个包含原始数组元素值的字段的嵌入文档数组

转载 作者:可可西里 更新时间:2023-11-01 10:36:14 26 4
gpt4 key购买 nike

我有一个文档集合,其中一个字段当前是一个 ObjectId 项数组。

{
_id: ObjectId(...),
user: "jdoe",
docs: [
ObjectId(1),
ObjectId(2),
...
]
}
{
_id: ObjectId(...),
user: "jsmith",
docs: [
ObjectId(3),
ObjectId(4),
...
]
}

如何更新集合中的所有文档以将 docs 字段转换为包含等于原始元素值的“docID”字段的对象数组?

例如,我希望我的文档最终看起来像:

{
_id: ObjectId(...),
user: "jdoe",
docs: [
{ docID: ObjectId(1) },
{ docID: ObjectId(2) },
...
]
}
{
_id: ObjectId(...),
user: "jsmith",
docs: [
{ docID: ObjectId(3)},
{ docID: ObjectId(4)},
...
]
}

我希望有一个我可以从 shell 运行的命令,例如:

db.getCollection('myCollection').update(
{},
{
$set: {
'docs.$[]: { docID: '$$VALUE'}
}
},
{multi: true }
);

但我不知道如何引用元素的原始值。


更新:

我正在用正确答案标记@mickl,因为它让我走上了正确的轨道。下面是我最终得到的最终聚合,如果它是一个对象 ID 数组,仅更改 docs 字段,否则现有值保持原样,包括没有文档的文档字段。

db.getCollection('myCollection').aggregate([
{ $addFields: {
'docs': { $cond: {
if : { $eq: [{ $type: { $arrayElemAt: [ '$docs', 0]} }, "objectId"]},
then: { $map: {
input: '$docs',
in: { tocID: '$$this'}
}},
else : '$docs'
}}
}},
{ $out: "myCollection" }
])

最佳答案

您可以使用 $map reshape 您的数据和$out用聚合结果替换现有集合:

db.col.aggregate([
{
$addFields: {
docs: {
$map: {
input: "$docs",
in: { docID: "$$this" }
}
}
}
},
{ $out: "col" }
])

关于mongodb - 如何将一个 ObjectIds 数组转换为一个包含原始数组元素值的字段的嵌入文档数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56839993/

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