看起来这可能是MongoDB的一个悬而未决的问题https://jira.mongodb.org/browse/SERVER-831,但我不确定是否真的有解决方案而且我只是在思考和研究错误的方式。
以下是我的架构的一个子集:
var myModel = new mongoose.Schema({
arrayA: [{
subArrayA: [{
fieldA: String
}],
subArrayB: [{
fieldB: String
}]
}],
});
我想通过将值推入更新subArrayA。我尝试过以各种方式做到这一点但没有成功。这是最简单的尝试:
myModel.findByIdAndUpdate(req.mymodel.arrayA.id(req.params.id), {
$push: {
subArrayA: {
fieldA: valA
}
}
}, function(err) {
// some stuff
});
直接推送到arrayA时可以正常工作。例如,下面的代码执行我希望的方式 - 通过将值推送到arrayA:
myModel.findByIdAndUpdate(req.mymodel.id, {
$push: {
arrayA: {
fieldA: valA
}
}
}, function(err) {
// some stuff
});
答案 0 :(得分:0)
看来你正在寻找"dot notation"。这是一种指定对象的子元素而不指定整个事物的方法。
但是你确实指定了你的架构没有的实际模型:
var Model = mongoose.model( "Model", myModel );
mongoose.connect('mongodb://localhost/test');
Model.findByIdAndUpdate(req.mymodel.arrayA.id(req.params.id), {
"$push": {
"arrayA.subArrayA": {
"fieldA": valA
}
}
}, function(err) {
// some stuff
});
所以现在你可以在不覆盖给定级别的整个对象的情况下记录更新。
答案 1 :(得分:0)
我能够使用MongooseArray方法“推送”。
req.mymodel.arrayA.id(req.params.id).subArrayA.push({fieldA:ValA});
req.mymodel.save(function (err) {
// some stuff
});