我正在尝试创建分析工具。它将读取一些句子并处理它并获得当天的一些关键字。过了一段时间,我会再次做同样的事情。因此,每次我得到它,我必须保存它,下次同一个词出现,我想增加给定值的字数。
所以例如我得到内容:{stackoverflow:2,问题:5}我第一次保存,下次我得到内容:{stackoverflow:3,回答:2}我应该更新旧记录,记录将看起来像这样的内容:{stackoverflow:5,问题:5,回答:2}。
我不知道会发生什么字,所以我创建了内容:Schema.Types.Mixed但只允许使用$ inc。
{ [MongoError: Modifier $inc allowed for numbers only]
name: 'MongoError',
lastErrorObject:
{ err: 'Modifier $inc allowed for numbers only',
code: 10152,
n: 0,
connectionId: 77,
ok: 1 },
errmsg: 'Modifier $inc allowed for numbers only',
ok: 0 }
知道该怎么做吗?
更新:我的代码。
for(index in wordsArray){
var word = wordsArray[index];
if(word!==topic && excludedWords.indexOf(excludedWords)===-1){
if(slotLoc[word])
++slotLoc[word];
else
slotLoc[word] = 1;
}
}
Words.findOneAndUpdate({slot:slot},{$inc:{content:slotLoc}},{upsert:true},function(err){
if(err)
console.log(err)
else
console.log("Saved Tweet");
})
此致 吉希纳
答案 0 :(得分:2)
你非常接近,但你需要使用带点符号的键而不是嵌套对象来构建$inc
对象的值,使其看起来像{ 'content.foo': 1, 'content.bar': 2 }
。
因此,请将您的代码更新为:
var inc = {};
for(index in wordsArray){
var word = wordsArray[index];
if(word!==topic && excludedWords.indexOf(excludedWords)===-1){
var key = 'content.' + word;
if(inc[key])
++inc[key];
else
inc[key] = 1;
}
}
Words.update({slot:slot}, {$inc: inc}, {upsert:true}, function(err){
if(err)
console.log(err)
else
console.log("Saved Tweet");
});
请注意,我使用的是update
而不是findOneAndModify
,因为您只需要返回原始文档或生成的文档。