假设我有这个模型:
var stuffSchema = new mongoose.Schema({
"id": 1,
"cars": {
"suv": [],
"sports": [],
"supercar": [{
"owner": "nick",
"previousOwners": [
ObjectId("574e1bc0abfb4a180404b17f"),
ObjectId("574e1bdeabfb4a180404b180"),
ObjectId("574e1c4babfb4a180404b181"),
ObjectId("574e1c67abfb4a180404b182"),
ObjectId("574e23abd25baf340e678b2d"),
ObjectId("574e241ec8caa3a81cc85ed5")
]
}]
}
});
var Stuff = mongoose.model('Stuff', stuffSchema);
如果特定的
previousOwners
已经存在,我想添加一个owner
;如果特定的owner
还不存在,我想添加一个新的previousOwner
及其相应的owner
。这是我尝试过的:
Stuff.update({
id: 1,
'cars.supercar.owner': 'olix'
}, {
$addToSet: {
'cars.supercar.$.previousOwners': ObjectId("574e241ec8caa3a81c893e73")
}
}, {
$upsert: true
}, function(err) {
if (err) {
console.log('Error: ' + err);
}
});
我希望这会添加一个名为'olix'的新
owner
以及其previousOwners
数组。那会使我的文档看起来像这样:{
"id": 1,
"cars": {
"suv": [],
"sports": [],
"supercar": [{
"owner": "nick",
"previousOwners": [
ObjectId("574e1bc0abfb4a180404b17f"),
ObjectId("574e1bdeabfb4a180404b180"),
ObjectId("574e1c4babfb4a180404b181"),
ObjectId("574e1c67abfb4a180404b182"),
ObjectId("574e23abd25baf340e678b2d"),
ObjectId("574e241ec8caa3a81cc85ed5")
],
"owner": "olix",
"previousOwners": [
ObjectId("574e241ec8caa3a81c893e73")
]
}]
}
}
它根本不起作用。它甚至没有产生错误。
我试过了:
db.stuffs.find({id: 1, 'cars.supercar.owner': 'nick'})
并成功返回文档。只是为了确保我的查询是正确的。
我究竟做错了什么?
最佳答案
首先,您的架构定义不正确,请改用此:
var stuffSchema = new mongoose.Schema({
'id': Number,
'cars': {
'suv': [],
'sports': [],
'supercar': [{
_id: false,
'owner': { type: String },
'previousOwners': [{ type: mongoose.Schema.ObjectId }]
}]
}
});
var Stuff = mongoose.model('Stuff', stuffSchema);
将更新查询更改为此:
Stuff.update({
id: 1
}, {
$addToSet: {
'cars.supercar': {
'owner': 'olix',
'previousOwners': [ObjectId('574e241ec8caa3a81c893e75')]
}
}
}, function(err) {
if (err) {
console.log('Error: ' + err);
}
});
注意:猫鼬会检查对象的每个属性,因此,如果超级跑车数组对象的所有者字段与previousOwners数组完全相同,则超级跑车数组对象相同,否则它将把新对象推入超级跑车数组。
关于javascript - Mongo更新无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37572831/