2013-05-24 9 views
1

Я новичок в node.js, и heroku, я создал небольшое приложение, которое использует node.js и извлекает некоторые данные из экземпляра mongodb. Я настраиваю все это, но моя проблема в том, что я считаю простую синтаксическую проблему с mongodb.Mongodb, найти, если коллекция пуста, node.js

Мне нужно знать о запуске приложения, что в моей коллекции есть какие-либо вещи или нет, если нет, чем инициализировать его. Я попытался вызвать collection.count(), но возвращает undefined.

Я попытался сделать это

mongo.connect(mongoUri, {}, function(err, database) { 
    if(!err) { 
     db = database; 
     console.log("Connected to 'testdb' database, HERE"); 
     db.collection('tests', {safe:true}, function(err, collection) { 
      if (err) { 
       console.log("The 'tests' collection doesn't exist. Creating it "); 
       populateDB();//This would work for the first time I install the app on heroku 
      } 
      else { //Collection exists, but nothing is in it, this is where I am lost 
      console.log("now I am HERE"); 
      //I do not know how to mimic this piece of code 
      //if((collection("tests").find().toArray.size() == 0 or empty or the equivalent of it) { 
      // populateDB(); 
      //} 
      console.log((collection("tests").find().toArray.size())); 
      } 
     }); 
    } 
    else { 
     console.log("COULD NOT CONNECT TO MONGO: " + mongoUri); 
    } 
}); 

Приветствуется любая помощь.

+0

Вы пробовали 'collection.count()' –

+0

Примечание по строке 6 исходного кода, когда 'если (ERR)' правда, это не означает, что коллекция не существует и что вы должны заполнить БД. В Mongodb вы можете запросить коллекцию, которая не существует, без запуска сообщения об ошибке. В отличие от RDBMS, такой как Mysql, где вам нужно создать таблицу, прежде чем вы сможете вставлять данные, в mongodb вам не нужно создавать коллекцию, прежде чем вы сможете вставлять в нее данные. Вставка данных в первый раз создает коллекцию. – surfbuds

ответ

4

Любые методы драйвера MongoDB, которые обращаются к данным в базе данных (например, count и toArray), предоставляют их результаты асинхронно с помощью параметра функции обратного вызова, а не через возвращаемое значение, чтобы они не блокировали единственный узел .js.

Так что чек будет идти-то вроде этого:

collection.count(function (err, count) { 
    if (!err && count === 0) { 
     populateDB(); 
    } 
}); 
+0

Спасибо, поэтому моя проблема была скорее вопросом node.js, чем mongodb, я думаю? –

+0

@sleepy_ios Это правда. Любой драйвер базы данных работает таким образом в node.js. – JohnnyHK

Смежные вопросы