使用MongoDB和Nodejs计算未定义

时间:2016-01-19 17:26:35

标签: javascript node.js mongodb

问题

Node.js MongoDB库始终为collection.count({})返回undefined。这个问题已被多次发布和回答,我一定会查看以前的所有解决方案,但似乎都没有,我总是未定义。

作为问题的背景,我正在制作一个Job Automator,在添加新作业之前,我想确保数据库中已经存在0条记录,这些记录与正在添加的新作业具有相同的名称(即名字是独一无二的)。 编辑:在某些情况下,我确实希望允许重复,因此我不希望在数据库级别使用索引和禁用重复项。

代码

在这种情况下,console.log()内的count只打印未定义。在这种情况下,我在调试时放入了一个空的查询字符串(当前没有测试名称冲突)。

add: function(io, newJob)
    {
    //mc is where require('mongodb').MongoClient is saved
    //connectionString contains a valid connection string
    //activeCollection contains the name of the collection
    //(I am sure mc, connectionString and activeCollection are valid)
    //I know this as I have used them to insert documents in previous parts
    mc.connect(connectionString, function(err,db)
        {
        if(err)
            throw err;
        else
            {
            db.collection(activeCollection, function(err,collection)
                {
                if(err)
                    throw err;
                //Start of problematic part
                //See also "What I've tried" section
                collection.count({},function(err,count)
                    {
                    console.log(count);
                    });
                //End of problematic part
                //Omitting logic where I insert records for brevity,
                //as I have confirmed that works previously.
                });
            }
        db.close();
        });
    }

我尝试了什么

我已阅读上述问题,并使用以下块替换了上一代码块中//Start of problematic part//End of problematic part之间的内容:

完全断开回调(也打印undefined):

function countDocs(callback)
    {
    collection.count({},function(err, count)
        {
        if(err)
            throw err;
        callback(null, count);
        }
    }

countDocs(function(err,count)
    {
    if(err)
        throw err;
    console.log(count);
    });

我甚至尝试过我认识不起作用的东西

var count = collection.count({});

新(1/28/16)

我没有检查count()中的错误,这有点草率,所以我在if(err)console.log(err);块中添加了count(),结果错误是:

{ [MongoError: server localhost:27017 sockets closed] 
name: 'MongoError', 
message: 'server localhost 27017 sockets closed' }

我真的不明白,因为在代码的其他部分,我能够使用相同的connect()和collection()调用,并且可以很好地插入数据库。基于此的任何见解?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

让我们来处理问题的意图:

  

我正在制作Job Automator,在添加新作业之前,我想   确保数据库中已存在0条记录   与要添加的新作业相同的名称(即名称是唯一的)。

而不是通过javascript,只需在名称键上set a unique index。在蒙戈:

db.collection.ensureIndex( { name: 1 }, { unique: true } )

然后,当您插入文档时,请使用try / catch块来捕获任何创建具有重复名称的文档的尝试。

答案 1 :(得分:0)

您可以使用collection.find().toArray(function(err,documents) { ...});,如果没有与您的查询匹配的文档,则会返回一个空数组。检查数组的length属性应该等同于count()尝试实现的属性。

文档中的更多信息:https://mongodb.github.io/node-mongodb-native/api-generated/cursor.html#toArray