Mongoose,更新子文档

Eug*_*kov 2 mongoose mongodb node.js

请考虑以下架构

Var Schema = new Schema({
  username: {Type: String},
  ...
  ...
  contacts: {
    email: {Type: String},
    skype: {Type: String}
    }
  })
Run Code Online (Sandbox Code Playgroud)

由于每个用户只能说一个电子邮件和Skype,我不想使用带有联系人的数组.

丢弃数据库查询和错误处理我尝试做类似的事情

// var user is the user document found by id
var newValue = 'new@new.new';
user['username'] = newValue;
user['contacts.$.email'] = newValue;
console.log(user['username']); // logs new@new.new    
console.log(user['contacts.$.email']); // logs new@new.new
user.save(...);
Run Code Online (Sandbox Code Playgroud)

没有错误发生,用户名成功更新,而联系人子文档仍为空.我在那里想念什么?

Joh*_*yHK 5

$从路径中删除索引,因为contacts它不是数组,并使用该set方法而不是尝试直接操作user使用路径的属性:

var newValue = 'new@new.new';
user.set('contacts.email', newValue);
user.save(...);
Run Code Online (Sandbox Code Playgroud)

或者您可以email直接修改嵌入字段:

var newValue = 'new@new.new';
user.contacts.email = newValue;
user.save(...);
Run Code Online (Sandbox Code Playgroud)

如果它不仅仅是您问题中的拼写错误,那么您的另一个问题是您需要使用type而不是Type在您的架构定义中.所以它应该是:

var Schema = new Schema({
  username: {type: String},
  ...
  ...
  contacts: {
    email: {type: String},
    skype: {type: String}
    }
  });
Run Code Online (Sandbox Code Playgroud)