我有两个模式
用户架构
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的嵌套用户文档
这就是为什么我创建了一个根,它获取activeUser id(来自post请求(。然后,找到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 currentActiveUsern' + 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:UsersJsennin~DocumentsWordPokerServernode_modulesmongodblibcoreerror.js:51:12)
at toError (C:UsersJsennin~DocumentsWordPokerServernode_modulesmongodblibutils.js:149:22)
at C:UsersJsennin~DocumentsWordPokerServernode_modulesmongodbliboperationscommon_functions.js:376:39
at handler (C:UsersJsennin~DocumentsWordPokerServernode_modulesmongodblibcoresdamtopology.js:913:24)
at C:UsersJsennin~DocumentsWordPokerServernode_modulesmongodblibcmapconnection_pool.js:356:13
at handleOperationResult (C:UsersJsennin~DocumentsWordPokerServernode_modulesmongodblibcoresdamserver.js:493:5)
我搜索了很多,但我发现只更新了嵌套文档的一部分(如{ "$set": { "currentActiveUser.name": user.name }
(,而没有更新整个嵌套文档。如何更新整个嵌套文档?
编辑
我发现了导致错误的错误。在我使用的刷新根目录中返回用户数组的var user = await Users.find(currentUser.currentActiveUser._id);
(不过它只有一个元素(,而我应该键入findOne
,这就是为什么它会导致重复错误,因为它是null。
试试这个:
var user = await Users.findOne(currentUser.currentActiveUser._id);
await currentUser.replaceOne({ "_id": user.id }, { user }});