2

考虑以下架构

Var Schema = new Schema({
  username: {Type: String},
  ...
  ...
  contacts: {
    email: {Type: String},
    skype: {Type: String}
    }
  })

由于每个用户只能声明一封电子邮件和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(...);

没有错误发生并且用户名被成功更新,而联系人子文档仍然是空的。我在那里想念什么?

4

1 回答 1

7

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

var newValue = 'new@new.new';
user.set('contacts.email', newValue);
user.save(...);

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

var newValue = 'new@new.new';
user.contacts.email = newValue;
user.save(...);

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

var Schema = new Schema({
  username: {type: String},
  ...
  ...
  contacts: {
    email: {type: String},
    skype: {type: String}
    }
  });
于 2013-10-31T16:31:45.580 回答