Mongoose查询只保留50个文件

时间:2015-08-06 11:24:28

标签: node.js mongodb mongoose

如何在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);
        }
    });

}

4 个答案:

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