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