2015-09-07 53 views
1

我知道这个问题已经在这里被打死了,但我已经尝试了一切,不能解决这个问题。这让我发疯。Mongoose/MongoDB更新不起作用

我有一个模型,看起来像这样:

customer { 
email: String, 
password: String, 
addresses: [addresses_schema] 
} 

和addresses_schema貌似

address { 
addr1: String, 
... Other address fields 
primary_address: Boolean 
} 

现在,我想更新用户的特定地址记录有一个真primary_address 。

所以我做的:

var modifyUser = function(address_id){ 
    User.findOne({ email: email }).then(function(user){ 
    user.update({ 'addresses._id': address_id }, 
       { $set: { 'addresses.$.primary_address': 'true' } }) 

     .then(function(){ 
     console.log('Should eventually reach here'); 
     }).catch (err) { 
      console.log('err:', err.message); 
     }); 


    user.save(); 
    }); 
} 

但是,如果我抢user.addresses和更新后,没有什么变化,在众人面前。相反,它给了我错误:

cannot use the part (addresses of addresses._id) to traverse the element ({addresses[ {addr1: '123 test street', addr2: '', city: 'test city' ... ]} 

有人可以帮助我吗?我真的很感激。谢谢!

+0

我在这里看不到任何回调。你是否试图直接从函数调用中返回? –

+0

@BlakesSeven下面有~300行代码我不想在这里复制粘贴。我不想退还,我只想更新我找到的用户。我更新了我的问题。 – Steve

+0

显示处理'.update()'然后查看数据的“最小示例”。无论如何,你可能真的想要['.findOneAnUpdate()'](http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate)。但是我的主要观点是,在这里'.update()'没有任何承诺或回调,所以至少在查看数据时它可能没有被“解雇”。你需要显示多一点*“之后有更多的代码”*。显示真正发生的事情(简而言之),但主要的行动。 –

回答

1

在这里,我的钱是您所查找实际上并不匹配任何的“ADDRESS_ID”值。在回溯文档上执行.update()通常不是您想要的,这会在代码中混淆问题。

转而执行.findOneAndUpdate()最初都是由匹配的“电子邮件”和在这个完整的例子做了“addresses._id”值检索:

var async = require('async'), 
    mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

var addressSchema = new Schema({ 
    name: String, 
    primary: { type: Boolean, default: false } 
}); 

var userSchema = new Schema({ 
    email: String, 
    addresses: [addressSchema] 
}); 

var User = mongoose.model('User',userSchema); 

mongoose.connect('mongodb://localhost/utest'); 

mongoose.set("debug",true); 

async.series(
    [ 
    function(callback) { 
     User.remove({},callback); 
    }, 
    function(callback) { 
     async.waterfall(
     [ 

      function(callback) { 
      User.create({ 
       email: "[email protected]", 
       addresses: [ 
       { "name": "One" },{ "name": "Two" } 
       ] 
      },callback) 
      }, 

      function(user,callback) { 
      console.log(user); 
      User.findOneAndUpdate(
       { 
       "email": user.email, 
       "addresses._id": user.addresses[1]._id 
       }, 
       { 
       "$set": { "addresses.$.primary": true } 
       }, 
       { "new": true } 
      ).then(function(newUser) { 
       console.log(newUser); 
       callback(); 
      }).catch(function(err) { 
       callback(err); 
      }); 
      } 
     ], 
     callback 
    ) 
    } 
    ], 
    function(err) { 
    if (err) console.log(err.stack); 
    mongoose.disconnect(); 
    } 
); 

这将始终如一地产生输出这样的:

{ __v: 0, 
    email: '[email protected]', 
    _id: 55ecf31a53558e183d208aa2, 
    addresses: 
    [ { name: 'One', _id: 55ecf31a53558e183d208aa4, primary: false }, 
    { name: 'Two', _id: 55ecf31a53558e183d208aa3, primary: false } ] } 
{ _id: 55ecf31a53558e183d208aa2, 
    email: '[email protected]', 
    __v: 0, 
    addresses: 
    [ { name: 'One', _id: 55ecf31a53558e183d208aa4, primary: false }, 
    { name: 'Two', _id: 55ecf31a53558e183d208aa3, primary: true } ] } 

而且具有调试输出中是这样的:

Mongoose: users.remove({}) {} 
Mongoose: users.insert({ email: '[email protected]', _id: ObjectId("55ecf35627cddb243d3d8e22"), addresses: [ { name: 'One', _id: ObjectId("55ecf35627cddb243d3d8e24"), primary: false }, { name: 'Two', _id: ObjectId("55ecf35627cddb243d3d8e23"), primary: false } ], __v: 0 }) 
Mongoose: users.findAndModify({ 'addresses._id': ObjectId("55ecf35627cddb243d3d8e23"), email: '[email protected]' }) [] { '$set': { 'addresses.$.primary': true } } { new: true, upsert: false, remove: false } 

这只是设置示例,但主要的事情发生在.findOneAndUpdate(),在承诺的解决方案中,您将返回的文档从指定数组元素的原始表单看到“更新”。

这就是你基本上应该在这里做的事情,并且对返回文档的任何进一步修改都是在“最初的”更新和获取“之后”完成的。

0

我不知道你是否真的需要使用猫鼬,不知道这是否是你的问题的要求。

这里是直Monogodb司机的例子:

var MongoClient = require('mongodb').MongoClient 
    , format = require('util').format; 

MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) { 
if(err) throw err; 

db.collection('test').findAndModify(
    {hello: 'world'}, // query 
    [['_id','asc']], // sort order 
    {$set: {hi: 'there'}}, // replacement,  replaces only the field "hi" 
    {}, // options 
    function(err, object) { 
     if (err){ 
      console.warn(err.message); //  returns error if no matching object found 
     }else{ 
      console.dir(object); 
     } 
    }); 
});