簡體   English   中英

為什么我可以在MongoDB中更新一個字段,而不更新另一個字段? (MEAN Stack)

[英]Why can I update one field but not another in MongoDB? (MEAN Stack)

我的db.user mongoDB集合中有兩個字段:“ password_hash”和“ password_token”。 我可以從API更新“ password_hash”(通過快速路由,將其更新為貓鼬模型),但是我無法使用幾乎完全相同的代碼來更新“ password_token”。 我可以從Studio3t中“手動”修改其中任何一個,但這會破壞編寫API的目的。 我還認為這意味着此行為與數據庫集合上的索引,驗證器等無關,因為允許在任何一個字段中保存值。 當我嘗試通過API執行相同操作時,沒有收到錯誤消息,只有{ ok: 0, n: 0, nModified: 0 } ,也沒有更新字段。

這是縮寫的文檔:

"username" : "user1", 
"password_hash" : "$2a$10$pVTT8FS.WV.sba1wvVwYMu7hMqaGkP1toJx5PGMXrl/ZnLyLtqsYy", 
"password_token" : ""

這是我正在使用的curl命令:

# curl -w '\n' -H "Content-Type: application/json" -X POST -d '{ "username": "user1"}' http://localhost:3000/users/save_hash
{"success":true,"message":"Saved a hash for user1."}

# curl -w '\n' -H "Content-Type: application/json" -X POST -d '{ "username": "user1"}' http://localhost:3000/users/reset_user
{"success":true,"message":"Saved a reset token for user1."}

...兩者均按書面形式成功返回,但是第二個對DB字段“ password_token”沒有影響。

以下是結構相同的快遞路線:

router.post('/save_hash', (req, res, next) => {
    const username = req.body.username;
    User.getUserByUsername(username, (err, user) => {
        if (err) logger.error(err);
        if (user) {
            bcrypt.hash(user.password, 10, (err, hash) => {
                if (hash) {
                    User.saveHash(user.username, hash, err);
                    return res.json({success: true, message: 'Saved a hash for ' + user.username + '.'});
                }
            })
        }
    })
});

router.post('/reset_user', (req, res, next) => {
    const username = req.body.username;
    User.getUserByUsername(username, (err, user) => {
        if (err) logger.error(err);
        if (user) {
            crypto.randomBytes(20, (err, buffer) => {
                if (buffer) {
                    const token = buffer.toString('hex');
                    User.resetToken(user.username, 'test', err);
                    if (err) {logger.error(err) } else {
                        return res.json({success: true, message: 'Saved a reset token for ' + user.username + '.'});
                    }
                }
            });
        }
    })
});

這是模型上結構上相同的方法:

module.exports.saveHash = function (username, password_hash, callback) {
    const query = {'username': username};
    User.update(query, { $set: { 'password_hash': password_hash }}, (err_update, raw) => {
        if (err_update) { logger.error(err_update); } else {console.log('raw data: ', raw)}
    })
};

module.exports.resetToken = function (username, token, callback) {
    const query = {'username': username};
    User.update(query, { $set: { 'password_token': token}}, (err_update, raw) => {
        if (err_update) { logger.error(err_update); } else {console.log('raw data: ', raw)}
    })
};

“ password_hash”的卷曲,路由和模型按預期工作。 相同的副本來更新“ password_token”不起作用。 甚至可以進行以下修改:

module.exports.resetToken ...
User.update(query, { $set: { 'password_hash': token}}... // works. updates "password_hash" to the token value.

module.exports.resetToken ...
User.update(query, { $set: { 'password_hash': 'test'}}... // works. updates "password_hash" to 'test'.

...但是,如果我修改saveHash()(當前可用於更新“ password_hash”),使其改為“ password_token”,則不會修改“ password_token”:

module.exports.saveHash ...
User.update(query, { $set: { 'password_token': 'test'}}... /* Does not work. returns  { ok: 0, n: 0, nModified: 0 } ...and does not modify "password_token". */

...因此看來password_token字段本身存在“問題”,因為我可以使用完全相同的代碼來更新其他字段。

對於它的價值:我閱讀的所有文檔都說我應該能夠在一個不存在的字段上調用update(),它將由一個隱式$ set創建,但是我沒有發現它是案件。 我必須先使用MongoShell創建“ password_hash”和“ password_token”,然后才能進行更新:

db.users.update({},
  {$set : {"password_token":""}},
  {upsert:false,
  multi:true})

...所以我想知道我是否可能在地獄版本中,最后看到了一個症狀。

TL:DR; 我可以很好地更新一個字段“ password_hash”,但是使用基本相同的curl,route和model方法,不能更新另一個字段“ password_token”(以及我添加的任何其他字段),也不會返回任何錯誤。 是什么賦予了?

JohnnyHK給出的簡單答案是,我在數據庫中創建的新字段也未在用戶模式中定義。

我以前確實犯過同樣的錯誤。 沒有錯誤,唯一的提示是更新操作失敗,這意味着每當我向文檔中添加新字段時,都需要在我的手指上綁一個字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM