Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js MongoDB Upsert update

I'm writing a little application which scores keywords. So if "beirut" and "education" get entered in, if they haven't been seen before, I want to create a mongo entry, and give them a score of 1. If they have, I want to increment their score by one. I'm trying to do this with one update command, but I think I might be doing it wrong.

  • Ranking is the object representing the database
  • "key" is the keyword
rankingdb.update(
    {keyword:key},
    {keyword:key, {$inc:{score:1}}},
    {upsert:true, safe:false},
    function(err, data) {
      if (err) {
          console.log(err);
      }
      else {
          console.log("score succeeded");
      }
    }
);

SyntaxError: Unexpected token {

Can you not create a brand new document with an increment?

like image 818
mradfo21 Avatar asked Dec 10 '12 20:12

mradfo21


1 Answers

Your general approach is right, but as the error message suggests, you've got a syntax problem in your code.

Try this instead:

rankingdb.update(
    {keyword: key},
    {$inc: {score: 1}},
    {upsert: true, safe: false},
    function(err,data){
        if (err){
            console.log(err);
        }else{
            console.log("score succeded");
        }
    }
);

When an upsert needs to create a new object it combines the fields from the selector (first parameter) and the update object (second parameter) when creating the object so you don't need to include the keyword field in both.

Note that update() is deprecated in the 2.0 driver, so you should now use either updateOne() or updateMany().

like image 130
JohnnyHK Avatar answered Nov 15 '22 20:11

JohnnyHK