我正在编写代码,通过网站使用NodeJS的普通MongoDB驱动程序管理商家集合。当商家试图确认他们的帐户时,我的麻烦就发生了。代码使用$ unset来清除数据库中的值,从而激活商家的帐户。相反,查询返回true,但确认字段保持不变。以下是db.merchants.find({})打印的数据库中有问题的商家之一的示例(添加换行符以提高可读性):
{ "email" : "test@test.com", "password" : "<hashed password is here>",
"salt" : "<salt is here>", "access" : "merchant",
"created" : 1444000000000, "confirm" : "bKEQD0aiV8aXIQPY4CUxCm7KGSZ2pFJM",
"name" : "Test user",
"contact" : { "name" : "Test User",
"address" : "123 Cedar Ln N",
"city" : "Some City", "state" : "AA",
"zip" : "00000", "country" : "USA",
"phone" : "5555555555" },
"_id" : ObjectId("56133111d30ce5d4736323cb") }
AssumEffectively,这是用于将项目插入数据库的JS:
db.collection("merchants").insert({
name: "Test user",
email: "test@test.com",
.... more fields....,
confirm: "bKEQD0aiV8aXIQPY4CUxCm7KGSZ2pFJM"
}, someCallback);
...以下是我尝试取消设置“确认”字段的方法:
db.collection("merchants").findOne({email: "test@test.com"}, function(err, user) {
if(err) return handleError();
if(!user) return sendFailureMessageToClient();
if(client.confirm == user.confirm) {
db.collection("merchants").update({_id: user.id},
{$unset: {confirm: true}}, someCallback);
}
}
我确信上面的更新命令实际上正在执行。
我认为有关上述数据的一个有趣的事情是_id字段在最后......应该通常会发生吗?这会搞砸更新命令的$ unset吗?如果那不是问题,那么是什么?
提前感谢您的帮助。
编辑:我说明了为什么我使用单独的findOne请求然后更新。
答案 0 :(得分:0)
_id
是ObjectId的特殊BSON对象。使用id
字符串是不够的。您可能也想使用_id
:
db.collection("merchants").update({_id: ObjectId(user._id)},
您可能还想使用findAndModify
。
答案 1 :(得分:0)
您错过了user.id
中的下划线,应为user._id
。现在,它正在尝试使用undefined
_id。
如果不是这样,你应该在电子邮件领域进行更新,它会正常工作(假设它是唯一的)。
文档末尾的_id无关紧要,JSON / BSON字段中没有严格的顺序。维护订单的唯一时刻是数组内部。