我正在尝试更新现有馆藏的子档案。我收到了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 } }
);
});
答案 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和字符串。只要它没有更多内容,这将有效。如果是,那么您可以使用您想要保留的部分制作第二个版本。