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
,那么您需要接受这些限制并按照说明解决这些问题。
所以我正在使用 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
,那么您需要接受这些限制并按照说明解决这些问题。