我最初创建了一个字符串refillNote
,最近我决定将其转换为对象数组refillNotes
(请参见下文)。因此,我需要将每个用户的refillNote
字符串(来自对象refills
的字符串)的字符串值复制到新对象中。
由于两个项目都嵌套在不同的层中,因此我无法使用$set
方法获取字符串数据并将其注入到嵌套对象中。
这是User对象:
{
name:"Joe",
refills: [
{
refillNote: "original refill note",
refillNotes: [
{
note:"I need to copy the original refillNote here",
username:"Tim"
}
]
}
]
}
我只是想从笔芯数组中获取现有的refillNote
字符串值,并创建一个新的refillNotes
对象并将其注入到数组中,如上所示。
这是我用来将新对象添加到refillNotes数组的当前代码,但是问题是,我无法采用refillNote
值并在此处进行设置:
User.updateMany(
{},
{
$set: {
"refills.$.refillNotes": [
{ username: "Joe", note: "refills.$.refillNote" }
]
}
}
);
这当前将注释添加为文字字符串“ refills。$。refillNote”,因此我无法确定在此序列中我将能够提取原始refillNote
值并能够再次使用它在此$set
方法中。任何输入将不胜感激。
修改
最终使用了一个老旧的forEach解决方案(如下所示),我回避了这个问题,但是如果有人遇到过基于聚合器的mongodb解决方案(或缺少该解决方案)的话,那就太棒了。
User.find({})
.then(function(results) {
return results.map(function(user) {
user.refills.forEach(function(refill) {
if (refill.refillNote) {
refill.refillNotes = [
{ username: "Tim", note: refill.refillNote }
];
} else {
refill.refillNotes = [];
}
});
return user.save();
});
})
答案 0 :(得分:0)
您需要使用$map应用于每个数组元素。 这就是您需要的:
db.collection.aggregate([
{
"$addFields": {
"refills": {
"$map": {
input: "$refills",
as: "refill",
in: {
refillNote: "$$refill.refillNote",
refillNotes: [
{
"refillNote": "$$refill.refillNote",
name: "Tim"
}
]
}
}
}
}
},
{$out:'collection'}
])
会写:
[
{
"_id": ObjectId("5a934e000102030405000000"),
"name": "Joe",
"refills": [
{
"refillNote": "original refill note",
"refillNotes": [
{
"name": "Tim",
"refillNote": "original refill note"
}
]
}
]
}
]
如果您的refills.refillNotesd不必是数组(因为它已经位于'refills'数组中),只需删除上述聚集中的array元素:
...
refillNotes: {
"refillNote": "$$refill.refillNote",
name: "Tim"
}
}
...