我有一个使用以下架构的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
}
答案 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);
});
});
}