0

我正在尝试创建分析工具。它将读取一些句子并对其进行处理并获取当天的一些关键字。一段时间后,我会再次做同样的事情。因此,每次我得到它时,我都必须保存它,下次出现相同的单词时,我想将单词的计数增加给定值。

例如,我第一次保存内容时获得内容:{stackoverflow:2,问题:5},下次获得内容时:{stackoverflow:3,答案:2}我应该更新旧记录,记录看起来像此内容:{stackoverflow:5,question:5,answer:2}。

我不知道接下来会出现什么单词,所以我创建了 content: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");
})

问候, 吉什努

4

1 回答 1

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而不是 a 是findOneAndModify因为您只需要在想要返回原始文档或生成的文档时才需要它。

于 2013-03-12T12:19:22.810 回答