Mongoose和Mongodb:混合架构上的$ inc

时间:2013-03-11 19:10:41

标签: node.js mongodb mongoose

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

所以例如我得到内容:{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");
})

此致 吉希纳

1 个答案:

答案 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,因为您只需要返回原始文档或生成的文档。