簡體   English   中英

ZCCADDEDB567ABAE643E15DCF0974E503Z 保存除一個以外的所有更新

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM