node.js:当collection.insert工作时,Mongodb db.collection.find()不起作用

时间:2015-06-27 12:16:47

标签: javascript node.js mongodb express

我正在使用node.js / express,我有一个Mongodb来存储一些数据集。在网页上,用户可以输入,编辑和删除数据(一切正常)。例如,要添加数据,我有以下代码:

 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收集后添加...

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()却没有。另一方面,当我进入mongo shell时,命令工作正常。

我会对任何提示和想法表示感谢。

编辑: 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' } }

4 个答案:

答案 0 :(得分:3)

find会返回cursor,而不是匹配的文档本身。但更适合您的情况是使用findOne

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

答案 1 :(得分:0)

首先看起来不对的是你的语法对于find是不正确的。您需要将其称为函数。尝试:

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

答案 2 :(得分:0)

如果您在该网站http://cwbuecheler.com/web/tutorials/2013/node-express-mongo/上使用该方法 您必须更改代码

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

并像这样使用它

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

,如果要添加更多选项 这样做

collection.find({name:req.body.name},{limit:1,project:{a:1},skip:1,max:10,maxScan:10,maxTimeMS:1000,min:100})

您可以在这里http://mongodb.github.io/node-mongodb-native/2.0/api/Cursor.html

中找到所有内容

答案 3 :(得分:0)

您可以那样使用

app.get('/', (req, res) => {
  db.collection('quotes').find().toArray((err, result) => {
    console.log(result);
    })
})