MongoDB/Mongoose更新整个子文档/嵌套文档



我有两个模式

用户架构

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 }});

最新更新