0

分析ツールを作成しようとしています。いくつかの文を読んで処理し、その日のキーワードを取得します。しばらくすると、また同じことをするようになります。したがって、取得するたびに保存する必要があり、次に同じ単語が来るたびに、指定された値だけ単語の数を増やしたいと思います。

たとえば、最初にコンテンツを保存したときにcontent:{stackoverflow:2、question:5}を取得し、次にcontent:{stackoverflow:3、answer: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 に答える