gpt4 book ai didi

node.js - Mongoose:无法使用 $addToSet 或 $push 将新对象添加/推送到数组

转载 作者:IT老高 更新时间:2023-10-28 13:22:58 25 4
gpt4 key购买 nike

我使用 Nodejs、Hapijs 和 Mongoose。

我有一个架构和模型如下。

var schema = {
name: {
type: String,
required: true
},
lectures: {}
};

var mongooseSchema = new mongoose.Schema(schema, {
collection: "Users"
});
mongoose.model("Users", mongooseSchema);

出于某种原因,我需要保持“讲座”作为混合型。

在保存/创建文档时,我创建了一个嵌套属性 lectures.physics.topic[],其中 topic 是一个数组。

现在,我正在尝试使用 $addToSet 或 $push 将新对象添加/推送到“lectures.physics.topic”。

userModel.findByIdAndUpdateAsync(user._id, {
$addToSet: {
"lectures.physics.topic": {
"name": "Fluid Mechanics",
"day": "Monday",
"faculty": "Nancy Wagner"
}
}
});

但是文档根本没有得到更新。我也尝试使用 $push 。没有任何效果。可能是什么问题?

我尝试了另一种使用 mongoclient 的方法,直接更新数据库。它有效,请找到以下有效的代码

db.collection("Users").update({
"_id": user._id
}, {
$addToSet: {
"lectures.physics.topic": {
"name": "Fluid Mechanics",
"day": "Monday",
"faculty": "Nancy Wagner"
}
}
}, function(err, result) {
if (err) {
console.log("Superman!");
console.log(err);
return;
}
console.log(result);
});

每次请求命中都要启动mongo客户端。这不是一个可行的解决方案。

最佳答案

Mongoose 无法自动检测和保存对混合类型所做的更改,因此您需要通过调用 .markModified(path) 来“告诉”它混合类型的值已更改。 将路径传递给刚刚更改的 Mixed 类型的文档方法:

doc.mixed.type = 'changed';
doc.markModified('mixed.type');
doc.save() // changes to mixed.type are now persisted

在你的情况下,你可以使用 findById() 方法通过调用 addToSet() 进行更改 方法,然后触发 save() 持久化更改的方法:

userModel.findById(user._id, function (err, doc){
var item = {
"name": "Fluid Mechanics",
"day": "Monday",
"faculty": "Nancy Wagner"
};
doc.lectures.physics.topic.addToSet(item);
doc.markModified('lectures');
doc.save() // changes to lectures are now persisted
});

关于node.js - Mongoose:无法使用 $addToSet 或 $push 将新对象添加/推送到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32002697/

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