繁体   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