如何在MongoDB中删除旧数据并保存新数据?

时间:2016-08-22 07:21:47

标签: node.js mongodb mongodb-query

这是我的收藏品

[{
   '_id':'1',
   'name':'John',
   'message':'Hi'
},
{
   '_id':'2',
   'name':'John',
   'message':'Hey'
},
{
  '_id':'3',
  'name':'John',
  'message':'Hello'
}]

当我保存下一个数据时,

'_id' will be '4', 'name':'John', 'message':'howdy'. 

我想将'_id':'4'推送到收藏集并弹出'_id':'1';同样,当我将'_id':'5'保存到同一个集合'_id':'2'时会删除等等。

我想删除旧数据并保存集合中限制条目的新数据。

那我该怎么在MongoDB架构中写这个呢?

2 个答案:

答案 0 :(得分:1)

你不需要编写任何模式,只需要做一点逻辑。这就是

计算收集的数量并将新文档的_id除以计数并为其分配余数。现在,这个新的_id是您必须更新文档的地方。

count = numberOfDocumentsInCollection
newDoc._id = newDoc._id%count

以下是完整的代码。

var MongoClient = require('mongodb').MongoClient
var url = 'mongodb://localhost:27017/testdb';

var newDoc = {
  _id:4,
  name:"John",
  message:"this is vajahat"
}
MongoClient.connect(url,function(err,db){
  if(err)
    return console.log(err);
  var collection = db.collection('test');
  collection.count(function(err,count){
    // this is number of documents
    var idToBeUpdatedAt= newDoc._id%count;//<<-------Here is the trick
    delete newDoc._id;
    console.log(idToBeUpdatedAt,count);
    collection.updateOne({"_id":idToBeUpdatedAt},{"$set":newDoc},function(err,updated){
      if(err)
        return console.log(err);
      console.log("updated");
      db.close();
    });
  });
})

答案 1 :(得分:1)

您可以使用上限集合来实现此目的。 mongo shell中的一个示例:

db.createCollection('capped', {capped: true, size: 100000, max: 3})

将创建一个名为capped的上限集合,最大大小为100000字节,最多包含3个文档。插入新文档时,将删除最旧的文档。

> db.capped.insert({_id: 1, name: 'John', message: 'Hi'})
> db.capped.insert({_id: 2, name: 'John', message: 'Hey'})
> db.capped.insert({_id: 3, name: 'John', message: 'Hello'})

> db.capped.find()
{ "_id" : 1, "name" : "John", "message" : "Hi" }
{ "_id" : 2, "name" : "John", "message" : "Hey" }
{ "_id" : 3, "name" : "John", "message" : "Hello" }

插入新文档时:

> db.capped.insert({_id: 4, name: 'John', message: 'howdy'})

> db.capped.find()
{ "_id" : 2, "name" : "John", "message" : "Hey" }
{ "_id" : 3, "name" : "John", "message" : "Hello" }
{ "_id" : 4, "name" : "John", "message" : "howdy" }

自动从集合中删除最旧的文档。类似地:

> db.capped.insert({_id: 5, name: 'John', message: 'hello'})

> db.capped.find()
{ "_id" : 3, "name" : "John", "message" : "Hello" }
{ "_id" : 4, "name" : "John", "message" : "howdy" }
{ "_id" : 5, "name" : "John", "message" : "hello" }

有关详细信息,请参阅Capped Collections page