[英]Mongoose Saving All Updates Apart From One
我有一個使用以下模式的 Mongo 數據庫:
const userSchema = {
first_login: {
type: Date,
default: Date.now
},
last_login: {
type: Date,
default: Date.now
},
provider_use_count: {
logins: {
type: Object,
required: true
}
},
total_login_count: {
type: Number,
required: true,
default: 0
},
login_hours: [
{
type: Number,
required: true
}
],
playlists: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Playlist'
}
],
genres: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Genre'
}
],
artists: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Artist'
}
],
auth_providers: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Provider'
}
],
platform_ids: [
{
type: Object,
required: true,
}
]
}
我正在使用以下 function 更新它,它位於 class 中:
async updateUser(user, playlists, currentProvider) {
return new Promise((resolve, reject) => {
// Add one to the use count for the current provider
user.provider_use_count.logins[currentProvider]++;
user.total_login_count++;
user.last_login = new Date();
user.login_hours.push((new Date()).getHours() + 1);
return user.save((err, doc) => {
if(err){
return reject(err);
} else {
console.log(doc);
return resolve(doc);
}
});
});
}
但是,當我使用.save()
function 時,它不會存儲provider_use_count.logins
的更新值。 我已經嘗試了我能想到的一切:使用++
,復制 object 然后遞增它,獲取當前計數的變量然后保存它,從架構中刪除所需的字段,使用+ 1
,使用+= 1
,使用包含 object 的數組,該數組具有計數和提供者字段。
我沒有想法,因為保存 function 顯然有效——它保存了所有其他更新。 我覺得這可能是由於 Schema 造成的,我要么只是忽略了,要么以前沒有經歷過。
編輯:
未保存的確切字段是: user.provider_use_count.logins[currentProvider]++;
另外,我不依賴console.log(doc)
塊,我已經檢查了 Atlas,似乎該字段保持在0
,而所有其他字段都在更新。
由於我尚未實現任何其他身份驗證提供程序,因此相關字段應與total_login_count
相同
傳遞給 function 的user
object 的示例如下:
{
total_login_count: 7,
login_hours: [
20, 20, 20, 20,
21, 21, 20, 20
],
playlists: [],
genres: [],
artists: [],
auth_providers: [],
platform_ids: [ { provider: 'spotify', id: 'makingstuffs' } ],
_id: 5dadfe7c9a25cc0c6a4d387c,
first_login: 2019-10-21T18:52:44.814Z,
last_login: 2019-10-21T19:23:30.580Z,
provider_use_count: { logins: { spotify: 0 } },
__v: 7
}
問題在於 mongoose 存在保存混合數據類型的問題,因為它們被認為是schema-less
。 這意味着您必須在調用.save()
function 之前調用person.markModified('name_of_the_update_field')
。
我的updateUser()
function 現在看起來如下:
async updateUser(user, playlists, currentProvider) {
return new Promise((resolve, reject) => {
// Add one to the use count for the current provider
user.provider_use_count.logins[currentProvider]++;
user.markModified('provider_use_count');
user.total_login_count++;
user.last_login = new Date();
user.login_hours.push((new Date()).getHours());
return user.save((err, doc) => {
if(err)
return reject(err);
return resolve(doc);
});
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.