2015-06-27 2 views
4

Я использую node.js/express, и у меня есть Mongodb для хранения некоторых наборов данных. На веб-странице пользователь может вводить, редактировать и удалять данные (все работает нормально). Например, для добавления данных У меня есть следующий код:node.js: Mongodb db.collection.find() не работает во время работы collection.insert

router.post('/addset', function(req,res) { 
    var db = req.db; 
    var collection = db.get('paramlist'); 
    collection.insert(req.body, function(err, result){ 
     res.send(
      (err === null) ? { msg: '' } : { msg: err } 
     ); 
    }); 
}); 

В моем app.js файл я включаю линию

// Database 
var mongo = require('mongodb'); 
var monk = require('monk'); 
var db = monk('localhost:27017/paramSet1'); 

как

app.use(function(req,res,next){ 
    req.db = db; 
    next(); 
}); 

сделать базы данных доступный в остальной части кода (следуя этому руководству: http://cwbuecheler.com/web/tutorials/2013/node-express-mongo/, я начинаю с этими вещами).

Так что все это отлично работает. Моя проблема заключается в следующем: я хотел бы добавить тест, если набор данных с тем же именем уже находится в базе данных и дает сообщение пользователю. После этого ответа How to query MongoDB to test if an item exists? я попытался с помощью collection.find.limit (1) .size(), но я получаю ошибку

undefined is not a function 

Я попытался следующие вещи. В стоимость выше (router.post) Я попытался добавить после сбора вар линии ...

var findValue = collection.find({name:req.body.name}); 

Если я тогда делать console.log (findValue), я получаю огромный выход JSON. Затем я попробовал console.log (findValue.next()), но я получаю ту же ошибку (undefined не является функцией). Я также попытался

collection.find({name:req.body.name}).limit(1) 

, а также

collection.find({name:req.body.name}).limit(1).size() 

, но и получить эту ошибку. Итак, в общем, collection.insert, collection.update и collection.remove все работают, но find() не делает. С другой стороны, когда я вхожу в оболочку монго, команда отлично работает.

Я был бы признателен за любые рекомендации и рекомендации.

Edit: Выход на console.log (findValue) является:

{ col: 
    { manager: 
     { driver: [Object], 
     helper: [Object], 
     collections: [Object], 
     options: [Object], 
     _events: {} }, 
    driver: 
     { _construct_args: [], 
     _native: [Object], 
     _emitter: [Object], 
     _state: 2, 
     _connect_args: [Object] }, 
    helper: { toObjectID: [Function], isObjectID: [Function], id: [Object] }, 
    name: 'paramlist', 
    col: 
     { _construct_args: [], 
     _native: [Object], 
     _emitter: [Object], 
     _state: 2, 
     _skin_db: [Object], 
     _collection_args: [Object], 
     id: [Object], 
     emitter: [Object] }, 
    options: {} }, 
    type: 'find', 
    opts: { fields: {}, safe: true }, 
    domain: null, 
    _events: { error: [Function], success: [Function] }, 
    _maxListeners: undefined, 
    emitted: {}, 
    ended: false, 
    success: [Function], 
    error: [Function], 
    complete: [Function], 
    resolve: [Function], 
    fulfill: [Function], 
    reject: [Function], 
    query: { name: 'TestSet1' } } 

ответ

2

find возвращает cursor, не согласующие сами документы. Но лучше подходит для вашего дела: findOne:

collection.findOne({name:req.body.name}, function(err, doc) { 
    if (doc) { 
     // A doc with the same name already exists 
    } 
}); 
+0

Спасибо! Это, похоже, решает мою проблему. Все еще не уверен, что я понимаю, почему ограничение (1) не работает, но большое спасибо. – Tokeloshe

+0

Но как найти несколько записей с тем же именем? –

0

Первого, что выглядит неправильно ваш синтаксис неверен для находки. Вы должны назвать это функцией. Попробуйте:

collection.find({name:req.body.name}).limit(1).size(); 
+0

Спасибо за ваш ответ. Это на самом деле то, что я пытался, и что дало мне ошибку, но я ошибся, когда задал вопрос. Очень сожалею об этом. Я сейчас редактировал этот вопрос. – Tokeloshe

+0

Вы говорите, что получаете огромный выход JSON. Он содержит ожидаемые данные? Если он не читается, попробуйте форматировать JSON [например, этот] (http://www.freeformatter.com/json-formatter.html). – tom

+0

Я добавил вывод в вопрос. Я не думаю, что он содержит ожидаемые данные. – Tokeloshe