MongoJS - 唯一索引没有错误

MongoJS - No Error On Unique Index

所以我正在使用 MongoJS 搞乱 MongoDB,当存在唯一 ID 时似乎无法得到 returned 错误。

所以这是我使用的代码:

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);
  });

});

所以我点击 /register with username=username&password=password 最初它会将它添加到数据库中。如果我再次访问相同的 URL,即使我在 MongoLab 中设置了以下内容,我也不会收到任何错误,即已经有一个具有该用户名的条目:

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

我需要做什么才能获得 'err' 到 return 重复输入的正确错误代码?我相信它应该 return 11000.

谢谢

这似乎是来自 mongojs 的 "buggy" 响应,这可能是由于它实施了 returning "inserted" 对象作为响应。 "core" 驱动程序不会这样做,但会 return 一个 "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 );
    });

  });

所以似乎 mongojs "mucks this up" 在尝试 API 行为中的此更改时。因此,来自 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 }

如果它是一个新的 "unique" 值,那么响应将是:

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

如果您至少想要一个新文档的 _id,我会说使用 "upserts" 进行批量操作,但那里的实现也有问题。事实上,monjojs 仍然完成的 "wrapping" 方法根本不包括任何使用 "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 );
  }
);

它仍然没有报告重复键的错误(更新插入不会那样做)但是响应至少告诉你相关信息。在 "upsert" 上它会报告:

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

并且在找到该值并且因此由于 $setOnInsert 而未修改数据的地方,响应将是:

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

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