MongoDB无法取消特定字段的设置;最后的自动_id字段

时间:2015-10-06 03:04:44

标签: node.js mongodb

我正在编写代码,通过网站使用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请求然后更新。

2 个答案:

答案 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字段中没有严格的顺序。维护订单的唯一时刻是数组内部。