【发布时间】:2019-07-01 17:32:46
【问题描述】:
我有一个文档集合,其中一个字段当前是 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" }
])
【问题讨论】:
-
你可以在这里使用
$out聚合。db.getCollection('myCollection').aggregate([ { "$addFields": { "docs": { "$map": { "input": "$docs", "in": { "docID": "$$this" } } } }}, { "$out": "newCollection" } ])
标签: mongodb