簡體   English   中英

MongoDB/Mongoose 更新整個子/嵌套文檔

[英]MongoDB/Mongoose Updating Whole Sub/Nested Document

我有 2 個架構

用戶模式

const usersSchema = new schema({
    name: {
        type: String,
        required: [true, "name is required"],
        unique: true

    },
    email: {
        type: String,
        required: [true, "email is required"],
        validate: [validateEmail, 'Please fill a valid email address'],
        unique: true
    },
    password: {
        type: String,
        required: [true, "password is required"]
    },
    confirmed: {
        type: Boolean,
        default: true
    },
    (...)

});

活躍用戶Shema

const ActiveUsers = new schema({

    currentActiveUser: Users.schema,
    isInMatch: {
        type: Boolean,
        default: false
    }

});

首先,我使用嵌套用戶模式創建 activeUser 模式。

 var user= await Users.findOne({ $or: [{ name: req.query.nameOrEmail }, { email: req.query.nameOrEmail } ]});
await activeUsers.create({ currentActiveUser: user}, function (err) {
        if (err) res.send({ error: err.message });
});

在我的程序中,我更新了主用戶模式而不是 activeUser 的嵌套模式所以在某些時候我需要更新 activeUser 的嵌套用戶文檔

這就是為什么我創建了一個root,它獲取activeUser id(來自post request)。然后,找到activeUser,然后使用activeUser的嵌套文檔id從數據庫中找到主用戶模式。最后,用主用戶模式更新activeUser的嵌套文檔

router.post('/refreshAccountInfo', async (req, res) => {

    if (!req.body.tempID.match(/^[0-9a-fA-F]{24}$/)) { res.send("invalid user"); return; }

    var currentUser = await activeUsers.findOne({ _id: req.body.tempID });

    if (!currentUser) {
        res.send("invalid user"); return;
    }

    var user = await Users.find(currentUser.currentActiveUser._id);

    await currentUser.updateOne({ "$set": { currentActiveUser: user }}, (err) => {

        if (err) console.log('error at  updating currentActiveUser\n' + err);

    });
    console.log(JSON.stringify(currentUser));
    var updatedUser = currentUser.currentActiveUser;
    var response = {
        (...)
    }
    res.send('RefreshSuccess ' + JSON.stringify(response))

});

但是,它會導致錯誤。

錯誤

error at  updating currentActiveUser
MongoError: E11000 duplicate key error collection: 5e3fe48a014b768935d3730f_test.activeusers index: currentActiveUser.name_1 dup key: { currentActiveUser.name: null }
(node:15024) UnhandledPromiseRejectionWarning: MongoError: E11000 duplicate key error collection: 5e3fe48a014b768935d3730f_test.activeusers index: currentActiveUser.name_1 dup key: { currentActiveUser.name: null }
    at Function.create (C:\Users\Jsennin~\Documents\WordPokerServer\node_modules\mongodb\lib\core\error.js:51:12)
    at toError (C:\Users\Jsennin~\Documents\WordPokerServer\node_modules\mongodb\lib\utils.js:149:22)
    at C:\Users\Jsennin~\Documents\WordPokerServer\node_modules\mongodb\lib\operations\common_functions.js:376:39
    at handler (C:\Users\Jsennin~\Documents\WordPokerServer\node_modules\mongodb\lib\core\sdam\topology.js:913:24)
    at C:\Users\Jsennin~\Documents\WordPokerServer\node_modules\mongodb\lib\cmap\connection_pool.js:356:13
    at handleOperationResult (C:\Users\Jsennin~\Documents\WordPokerServer\node_modules\mongodb\lib\core\sdam\server.js:493:5)

我對此進行了很多搜索,但我發現只是更新了嵌套文檔的某些部分(例如{ "$set": { "currentActiveUser.name": user.name } ),而不是整個嵌套文檔。 如何更新整個嵌套文檔?

編輯

我發現我的錯誤導致錯誤。 在刷新根目錄中,我使用var user = await Users.find(currentUser.currentActiveUser._id); 它返回用戶數組(雖然只有 1 個元素),但我應該輸入findOne ,這就是它導致重復錯誤的原因,因為它是 null。

嘗試這個:

var user = await Users.findOne(currentUser.currentActiveUser._id);
await currentUser.replaceOne({ "_id": user.id }, { user }});

暫無
暫無

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

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