2015-07-31 2 views
3

Я не вижу изменений, отправленных на веб-сервер, почему?Node.js + MongoDB не делает upsert, почему?

  • сервер работает
  • я могу видеть в консоли, перед save правильный JSON: { "_id" : "abcd", "key1" : "value1" }

Это тело мое сообщение POST:

["Memorise", [["Diagram", {"_id" : "ab3sdscd", "key2" : "value1"}]]] 

var http = require('http'); 
var MongoClient = require('mongodb').MongoClient; 

var myServer = http.createServer(function(request, response) 
{ 
    if (request.method == 'POST') { 

    var data = ''; 

    request.on('data', function (chunk){ 
     data += chunk; 
    }); 

    request.on('end',function(){ 

     var obj = JSON.parse(data); 
     var databaseName = obj['db'] 

     MongoClient.connect("mongodb://localhost:27017/" + databaseName, function(err, db) { 

      if(!err) { 

       if (obj.length == 2) { 

        var recordsToUpsert = obj[1] 
        for (var i = 0; i < recordsToUpsert.length; i++) { 

         var recordToUpsertAndCollection = recordsToUpsert[i] 
         var collectionName = recordToUpsertAndCollection[0]; 
         var recordToUpsert = recordToUpsertAndCollection[1]; 
         var collection = db.collection(collectionName); 

         //console.log(collection) 
         console.log(recordToUpsert) 
         collection.save(recordToUpsert, {w:1}, { 

          //console.log("record upserted"); 
         }); 
        }; 

        response.writeHead(200) 
        response.end() 
       } 
      } 
     }); 
    }); 
    } 
}); 
myServer.listen(3000) 
+0

вы говорите, что тело запроса, что в настоящее время разбирается в 'obj'? Где ключ «db»? Я просто вижу массив с двумя элементами. Также вы не должны подключаться к MongoDB или к любой базе данных «по запросу». Во всяком случае, объедините соединение и просто выберите «пространство имен базы данных» для запроса, что довольно легко сделать. –

+0

Правильный, первый элемент - это имя базы данных '' Memorise', 'collectionName' под названием' Diagram' –

+1

Но вы запрашиваете 'obj ['db']', и этого не существует 'obj [0]' будет первый элемент массива. JavaScript «строит» практически везде. Таким образом, похоже, что вы подключаетесь к базе данных «undefined». У вас есть upserts. –

ответ

0

Это ваша полезная нагрузка разбираемый в obj:

["Memorise", [["Diagram", {"_id" : "ab3sdscd", "key2" : "value1"}]]] 

Вот проблема:

var databaseName = obj['db'] 

Смотрите, что вы просите «ключ» под названием «дб». Он не существует, поэтому databaseName - undefined.

Поскольку JavaScript «stringifies», то строка подключения выходит так:

"mongodb://localhost:27017/undefined" 

То есть, где все ваши данные собираются.

Fix его это простого изменение:

var databaseName = obj[0] 
0

Почему бы вам не использовать:

collection.update (критерии, обновление [[, опцию], обратный вызов]);

для upsert скорее сохранить?

Попробуйте это:

collection.update ({_ ID: recordToUpsert._id}, recordToUpsert {upsert: истинно}, yourCallbackMethod);

Смотрите эту ссылку: upsert

+1

'.save()' в основном является оберткой для «upsert». Всегда был. Это не проблема. Это ошибка логики кодирования. –

+0

Спасибо, я не знал этого :) – havish