2016-11-20 137 views
0

我有这样的事情:覆盖数据与猫鼬

Accounts.insertMany(topAccounts) 
      .then(function (result) { 
       console.log('Succesfully saved '+ result.length + ' documents... closing connection...') 
       mongoose.connection.close(); 
      }) 
      .catch(function(err){ 
       console.log('oh shit'); 
       console.log(err); 
      }) 

这所保存的数据追加到我的收藏。有什么方法可以覆盖它吗?保存数据之前删除集合是否是我的最佳解决方案?

回答

0

我一直在这种情况下,但为种子初始数据库数据。我发现了两个不同的解决方案:

  1. 删除集合 - model.collection.drop()
    这是不是删除所有文件中收集了大量的更快。 Mongoose会自动重新创建它,但我不认为它会自动确保创建索引。
    注意:当我这样做时,似乎有一个没有立即下降的竞赛状况。如果我打电话,然后插入(如果我记得正确),我最终收集了一个空集。我只是在插入所有种子文档之前设置了1秒的超时时间,并且工作正常。

  2. 删除所有文件 - model.remove()
    这是一个大集合很慢操作,因为它有每次删除文件时更新索引。


虽这么说,我不知道你是如何使用TopAccounts但它似乎像你像一个名称 - 值对,其中名称是TopAccounts处理它和值是TopAccounts数组。根据您使用这些帐户的方式,您可能需要考虑将所有TopAccounts存储在单个文档中 - 这甚至可以让您及时回溯并查看特定日期的最佳帐户。

你可以存储它是这样的,然后按日期查询:

{ 
    "_id": ObjectId("..."), 
    "date": Date("2016-11-19"), 
    "top_accounts": [ 
     {... top account #1 ...}, 
     {... top account #2 ...}, 
     {... top account #3 ...} 
     ... 
    ] 
} 
+0

谢谢兰迪。我喜欢你关于让topAccounts在它自己的文档中有各自的日期的建议,但我会坚持重写,因为我不想在一两年内担心存储问题。我正在做'Model.remove({},callback)',它可以很快完成工作(集合中只有4950个文档)。但是知道'.remove()'和'.drop()'之间的区别对于较大的集合将非常方便。 – jgozal