假设我有这个模型:

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/

10-11 08:45