[英]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.