【问题标题】:MongoDB/Mongoose Updating Whole Sub/Nested DocumentMongoDB/Mongoose 更新整个子/嵌套文档
【发布时间】:2021-03-26 08:15:50
【问题描述】:

我有 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
    },
    (...)

});

ActiveUser 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,这就是为什么它会导致重复错误,因为它为空。

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-schema subdocument


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 嗯,它完全删除了嵌套文档,activeUser在数据库中变成了这样_id:5fd99de400d855098cea5305 isInMatch:false __v:0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2016-08-04
    • 2018-09-04
    • 2016-10-06
    • 2014-09-23
    • 2013-08-12
    相关资源
    最近更新 更多