猫鼬保存所有更新,除了一个

时间:2019-10-21 19:12:08

标签: javascript node.js mongodb mongoose

我有一个使用以下架构的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,
        }
    ]
}

我正在使用以下函数进行更新,该函数位于一个类中:

    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()函数时,它没有存储provider_use_count.logins的更新值。我已经尝试了所有可以想到的方法:使用++,复制对象然后对其进行递增,获取当前计数的变量然后保存它,使用+ 1从架构中删除所需字段,使用+= 1,使用一个数组来容纳一个对象,该对象具有用于count和provider的字段。

保存功能显然可以正常工作-我保存了所有其他更新。我觉得这可能是由于Schema所致,这是我只是忽略或从未经历过的事情。

编辑:

未保存的确切字段是: user.provider_use_count.logins[currentProvider]++;

此外,我不依赖于console.log(doc)块,我已经检查了Atlas,似乎该字段仅保留在0,而其他所有字段都在更新。

由于我尚未实现任何其他身份验证提供程序,因此相关字段应与total_login_count相同

传递给函数的user对象的示例如下:

{
  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
}

1 个答案:

答案 0 :(得分:0)

问题在于,猫鼬在保存混合数据类型时遇到问题,因为它们被视为schema-less。这意味着您必须在调用person.markModified('name_of_the_update_field')函数之前先调用.save()

我的updateUser()函数现在如下所示:

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