无法更新Simple Schema子文档

时间:2015-10-30 12:55:45

标签: mongodb meteor

我正在尝试更新现有馆藏的子档案。我收到了MongoDB错误消息。

"MongoError: The positional operator did not find the match needed from the query. Unexpanded update: articleWords.$ [409]"

来自我的文章简单架构

"articleWords.$": {
  type: Object
},
"articleWords.$.wordId": {
  type: String,
  label: 'Word ID'
},
"articleWords.$.word": {
  type: String,
  label: 'Word'
},

更新功能

function updateArticle(_id,wordArr) {
  _.each(wordArr,function(elem) {
      var ret = Articles.update(
        {'_id': _id},
        { $set: { 'articleWords.$': { 'wordId': elem.wordId, 'word': elem.word } }
      });  
    }); 
  return true;
}

正如您所看到的,我正在传递一系列对象。有没有比_.each更好的方法呢?

澄清

感谢@corvid的回答。我想我没有说清楚我的问题。 确实存在文章记录,但 articleWords 属性中没有添加任何数据。基本上我们正在更新记录,但插入 articleWords 数组。

第二次尝试也无效

  _.each(wordArr,function(elem) {
      var ret = Articles.update(
        {'_id': _id},
        { $set: { 'articleWords.$.wordId': elem.wordId, 'articleWords.$.word': elem.word } }
      );  
    }); 

2 个答案:

答案 0 :(得分:1)

是的,您需要您的选择器匹配子文档中的内容。例如,

Articles.update({
  '_id': <someid>,
  'words.wordId': <somewordid>
}, {
  $set: {
    'words.$.word': elem.word,
    'words.$.wordId': elem.wordId
  }
});

答案 1 :(得分:1)

如果阵列尚不存在,那么你将以最艰难的方式解决这个问题。您可以一次性设置整个阵列:

var ret = Articles.update(
    {'_id': _id},
    { $set: { articleWords: wordArr }}
);

我可以看到wordArr已经有了id和字符串。只要它没有更多内容,这将有效。如果是,那么您可以使用您想要保留的部分制作第二个版本。