与javascript,游标方法的mongodb查询

我只是创build一个简单的用户login使用Express的MongoDB,骨干和节点。

我坚持查询数据库的用户凭据,并可靠地确定它们是否存在。

我在这里尝试两件事情:

// When user posts to the url app.post('/save/user', function (req, res) { // create user object and store email from form var user = { email : req.body.email }; // in my collection users db.collection('users', function (err, collection) { // create a variable existence with the value, in lamens terms 'yes it does' or 'no it doesnt' var existence = findOne(collection, { $query : {email : user.email} }); }); }; // findOne function passing the collection and the query object function findOne(coll, query) { var cursor = coll.find(query).limit(1); return cursor.hasNext() ? cursor.next() : null; } 

所以这是我一直在尝试的第一种方式。 事情是,我不明白为什么游标没有“next(),hasNext(),findOne(),forEach()”和其他方法的JavaScript环境,但只为mongo shell。

我的问题是,我如何从我的Node.js应用程序访问这些方法?

我尝试的第二种方法是:

//当用户发布到url app.post('/ save / user',function(req,res){

  // create user object and store email from form var user = { email : req.body.email }; // in my collection users db.collection('users', function (err, collection) { // Have a look for the email entered var query = collection.find({ $query : {email : user.email} }).limit(1); // If it's true, then send response query.each( function (err, item) { // If the item does exists, then send back message and don't insert. Otherwise, insert. if(item !== null) { console.log('Item does not equal null : ', item); res.send('The email : ' + item.email + ' already exists'); } else { console.log('Item does equal null : ', item); collection.insert(user); res.send('New user with email : ' + user.email + ' was saved'); } }); }); }; 

这个问题是,它总是会在某个时候返回null,所以我要警告用户'它已经存在',然后下一次将是空的,所以它会保存电子邮件。

我认为我错过了这一点,所以在正确的方向上的一个点将是伟大的。

提前谢谢了!


那么我已经看过一个解决scheme,但仍然必须缺less重点。

我正在做一个插入,传入我的用户对象与安全:true,但虽然可以input多个用户对象,它仍然只是寻找相同的ID; S。 我已经尝试使用新的ObjectID()创build一个id,但是我仍然不明白,如果用户input他们的电子邮件地址,然后尝试创build一个新的用户使用相同的电子邮件,它会为该条目创build一个新的ID。

通过执行findOne,我可以看到它是否容易存在,我不知道如何使用insert来完成。

 app.post('/register/user', function (req, res) { // Store user details in object var user = { username : req.body.user, email : req.body.email, password : req.body.password }; db.collection('users', function (err, collection) { collection.insert(user, {safe : true}, function (err, doc) { console.log('what is doc : ', doc); if(!err) { res.writeHead(200, { "Content-Type" : "text/plain", "Message" : "New user added", "Access-Control-Allow-Origin" : "*" }); } else { console.log('Error is : ', err); res.writeHead(200, { "Content-Type" : "text/plain", "Message" : "User already exists", "Access-Control-Allow-Origin" : "*" }); } res.end(); }); }); 

});

如果您使用的是Native Node.JS MongoDB驱动程序 ,则有一个collection.findOne()方法,并且cursor具有与shell方法hasNext()forEach()相同的nextObject()each()方法。 mongo shell等价物的实现/命名可以在驱动程序之间略有不同,但应该可以将mongo shell示例翻译成Node.JS。

至于保存一个新用户去..而不是在插入之前查询用户,最好是添加一个唯一的索引在email字段,并插入集合与safe:true 。 如果由于重复的电子邮件导致插入失败,则可以处理err结果。 如果在插入之前执行查询,那么当您检查邮件时可能不存在电子邮件竞争情况,但在插入时确实存在。