mongoDB node.js findAndModify麻烦

时间:2015-06-05 22:44:54

标签: javascript json node.js mongodb

我正在做关于MongoDB的在线课程,不幸的是有点过时了。似乎有些功能已经改变(当然我使用的是1.4版本。)

以下是我遇到问题的代码,我试图更新当前版本的MongoDB:

app.js

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

MongoClient.connect('mongodb://localhost:27017/course', function(err, db) {
if (err) throw err;

db.collection['counters'].findAndModify({
    query: {
        name: 'comments'
    },
    update: {
        $inc: {
            counter: 1
        }
    },
    new: true
}, function(err, doc) {
    if (err) throw err;

    if (!doc) {
        console.dir('No counter found for comments.');
    } else {
        console.dir('Number of comments: ' + doc.counter);
    }

    return db.close();
});
});

如果我通过Mongo shell运行相同的findAndModify,我会得到预期的结果(递增计数器并显示新文档),但是当我使用node运行它时,它对数据库没有影响并抛出此错误:

TypeError: Cannot call method 'findAndModify' of undefined

任何提示?

4 个答案:

答案 0 :(得分:1)

请尝试:

db.counters('counters').findAndModify

而不是:

db.collection['counters'].findAndModify

答案 1 :(得分:1)

哎呀,我只是错误的括号。应该有:

db.collection('counters')

而不是

db.collection['counters']

几乎像T_G说的那样。

答案 2 :(得分:1)

立即使用:

db.collection('counters').findOneAndUpdate(
    {name: 'comments'},     //query
    {$inc: {counter: 1}},   //update
    {                                               //options
        upsert: true,            // create the doc when it's not there
        returnOriginal:false     // return the modified doc *(new is not supported here!)
    }, 
    function(err, r){       //callback
        if(err) throw err;
        console.log('counter: '+r.value.counter);
    }
);

答案 3 :(得分:0)

来自mongodb docs:

  

可以使用集合

打开现有集合
db.collection([[name[, options]], callback);
     

如果禁用严格模式,则会创建新集合(如果尚未创建)   本。

所以你需要这样做:

db.collection('counters', function(err, collection){
    collection.findAndModify({
        query: {
            name: 'comments'
        },
        update: {
            $inc: {
                counter: 1
            }
        },
        new: true
    }, function(err, doc) {
        if (err) throw err;

        if (!doc) {
            console.dir('No counter found for comments.');
        } else {
            console.dir('Number of comments: ' + doc.counter);
        }
    });
});