如何在mongoose中进行查询,以查找用户是否有50个文档,然后删除最旧的文档并添加新文档,如果不是只添加新文档?
这是我的尝试:
Notifications.findOne({_id: userId}, function(err, results) {
if(err) throw err;
if(results.length < 50) {
saveNotification();
} else {
Notifications.findByIdAndUpdate(userId, {pull: //WHAT GOES HERE),
function(err, newNotify) {
if(error) throw error;
saveNotification();
});
}
});
function saveNotification() {
var new_notification = new Notification ({
notifyToUserId: creatorId,
notifyFromUserId: null,
notifyMsg: newmsg,
dateNotified: dateLastPosted
});
new_notification.save(function(err, results){
if(!err) {
console.log('notification has been added to the db');
cb(null, resultObject);
} else {
console.log("Error creating notification " + err);
}
});
}
答案 0 :(得分:2)
正如@Pio所提到的,我不认为您可以使用当前架构在一个查询中执行此操作。但是,如果您有机会更改架构,则可以使用以下文章Limit Number of Elements in an Array after an Update中描述的固定大小的阵列模式
基本上,您可以将用户的通知保留在一个文档中。文档的键将是userId,通知将存储在数组中。然后,以下查询将实现您的目标。
Notifications.update(
{ _id: userId },
{
$push: {
notifications: {
$each: [ notificationObject ], // insert your new notification
$sort: { dateNotified: 1 }, // sort by insertion date
$slice: -50 // retrieve the last 50 notifications.
}
}
}
)
答案 1 :(得分:0)
我不确定您是否可以在一个查询中执行此操作,但您可以
.count({user: yourUser'})
然后根据计数.insert(newDocument)
或更新最旧版本,以便您不会删除+插入。
答案 2 :(得分:0)
封顶收藏品按照您的要求做自己喜欢的事情。如果您定义大小为50的上限集合,它将只保留50个文档,并在您插入更多文档时覆盖旧数据。 检查
new Schema({..}, { capped: { size: 50, max: 50, autoIndexId: true } });
请记住,使用上限集合时,您只能进行就地更新。更新整个文档可能会更改将删除其他文档的集合大小。
答案 3 :(得分:0)
I ended up using cubbuk's answer and expanding it to add a notification if there is no array to start with along with upsert...
Notification.findOneAndUpdate({notifyToUserId: to}, {
$push: {
notifyArray: {$each: [newNotificationObject], // insert your new notification
$sort: { dateNotified: 1 }, // sort by insertion date
$slice: -50 // retrieve the last 50 notifications.
}
}
}, {upsert: true}, function(err, resultOfFound) {
if(err) throw err;
if(resultOfFound == null) {
var new_notification = new Notification ({
notifyToUserId: to,
notifyArray: [newNotificationObject]
});
new_notification.save(function(err, results){
if(!err) {
console.log('notification has been added to the db');
cb(null, resultObject);
} else {
console.log("Error creating notification " + err);
}
});
} else {
cb(null, resultObject);
}
});