MongoJS - 唯一索引没有错误

时间:2015-06-15 23:42:49

标签: mongodb mongojs

所以我使用MongoJS搞乱MongoDB,并且当存在唯一ID时,似乎无法返回错误。

所以这是我正在使用的代码:

server.post('/register', function (req, res, next) {
  var details = req.params;

  details.password = md5(details.password).toString();

  db.users.insert(details,
    function (err, test1, test2) {
      console.log(err);
  });

});

所以我用username = username& password = password命中/注册,最初将它添加到数据库中。如果我再次访问相同的网址,即使我在MongoLab中设置了以下内容,我也不会收到任何已存在该用户名条目的错误:

{
  "v": 1,
  "unique": true,
  "key": {
    "username": 1
  },
  "name": "username",
  "ns": "restapi.users",
  "background": true
}

我需要做些什么来解决“错误”问题。为重复输入返回正确的错误代码?我相信它应该返回11000。

由于

1 个答案:

答案 0 :(得分:1)

这似乎是来自mongojs的“错误”响应,这可能是因为它实现了将“插入”对象作为响应返回。 “核心”驱动程序不会执行此操作,但会返回“ok”响应或错误:

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

  MongoClient.connect('mongodb://localhost/test', function(err,db) {

    var collection = db.collection('users');

    collection.insert({ "username": 2 },function(err,res) {
      if (err) throw err;
      console.log( res );
    });

  });

因此,在尝试对API行为进行此更改时,似乎mongojs“将此问题搞砸了”。因此,Bulk操作的错误也未正确报告。但至少你可以得到一个回复​​,告诉你确定没有插入任何内容:

var mongojs = require('mongojs'),
    db = mongojs('test');


var collection = db.collection('users')

var bulk = collection.initializeOrderedBulkOp();

bulk.insert({ "username": 2 });
bulk.execute(function(err,res) {
  if (err) throw err;
  console.log( res );
});

如果用户名存在,则响应为:

{ writeErrors: [],
  writeConcernErrors: [],
  nInserted: 0,
  nUpserted: 0,
  nMatched: 0,
  nModified: 0,
  nRemoved: 0,
  upserted: [],
  ok: 1 }

如果它是一个新的“唯一”值,那么响应将是:

{ writeErrors: [],
  writeConcernErrors: [],
  nInserted: 1,
  nUpserted: 0,
  nMatched: 0,
  nModified: 0,
  nRemoved: 0,
  upserted: [],
  ok: 1 }

如果你想要至少一个新文档的_id,我会说使用"upserts"进行批量操作,但那里的实现也被破坏了。实际上,monjojs仍然完成的“包装”方法根本不包括使用“upserts”的任何选项。

所以你可以做的最后一件事是使用db对象中的.runCommand()方法并以这种方式处理“upsert”:

var mongojs = require('mongojs'),
    db = mongojs('test');

db.runCommand(
  {
    "update": "users",
    "updates": [
      {
        "q": { "username": 4 },
        "u": { "$setOnInsert": { "username": 4 } },
        "upsert": true
      }
    ],
    "ordered": true
  },
  function(err,res) {
    if (err) throw err;
    console.log( res );
  }
);

它仍然不会报告重复键的错误(upserts不会这样做),但响应至少会告诉您相关信息。在“upsert”上,它会报告:

{ ok: 1,
  nModified: 0,
  n: 1,
  upserted: [ { index: 0, _id: 5580da465e2076d9ea0c5885 } ] }

如果找到值并且由于$setOnInsert因此未修改数据,则响应将为:

{ ok: 1, nModified: 0, n: 1 }

因此,如果您仍然要使用mongojs,那么您需要接受这些限制并解决这些问题。