每次我对架构进行更改时,就像我添加了唯一索引或设置" sparse:true"到一个字段,我必须删除集合以获取应用的更改。这在我的生产服务器中是不可能的。有没有其他方法可以将更改应用到集合而不丢弃它?我是mongodb的新手。由于我使用的是mlab,我也无法重启mongo服务。请帮帮我。
注意:我使用的是nodejs版本4.2.0,mongoose 4.4.7,mongodb 3.2.9(我使用的是mlab)。
答案 0 :(得分:0)
当架构发生变化时,无需删除集合并重新创建它。
更多信息:
稀疏索引仅包含具有索引字段的文档的条目,即使索引字段包含空值也是如此。索引会跳过缺少索引字段的任何文档。索引是“稀疏的”,因为它不包含集合的所有文档。相比之下,非稀疏索引包含集合中的所有文档,为那些不包含索引字段的文档存储空值。
稀疏索引和不完整结果
如果稀疏索引会导致查询和排序操作的结果集不完整,MongoDB将不会使用该索引,除非提示()显式指定索引。
拥有稀疏索引并不会阻止我们插入带有或不带稀疏索引字段的记录,这足以让我们处理模式更改。
请参阅以下集合
Collection marks
{_id:1, sub1: 67, sub2: 78, sub3: 56, total: 201}
{_id:2, sub1: 60, sub2: 70, sub3: 50, total: 180}
{_id:3, sub1: 80, sub2: 70, sub3: 50}
Create sparse index
db.marks.createIndex( { total: 1 } , { sparse: true, unique: true } )
db.marks.find().sort( { total: -1 } )
This query will return all the 3 records, we have applied sort on the sparse indexed field, but MongoDB will not select the sparse index to fulfill the query in order to return complete results.
db.marks.find().sort( { total: -1 } ).hint( { total: 1 } ), this query will return only 2 records, those who are having the total, so to use the sparse index, explicitly specify the index with hint()
参考
https://docs.mongodb.com/manual/core/index-sparse/
https://docs.mongodb.com/manual/core/index-sparse/#sparse-index-incomplete-results
希望它有帮助!