2016-10-25 3 views
0

スキーマを変更するたびに、一意のインデックスを追加するか、フィールドに "sparse:true"を設定すると、変更が反映されるコレクションを削除する必要があります。これは本番サーバーでは不可能です。コレクションを削除せずに変更を適用する他の方法はありますか?私はmongodbに新しいです。私はmlabを使用しているので、mongoサービスも再開できません。これで私を助けてください。Mongodbはコレクションを削除せずにモデルの変更を適用します

注:nodejsバージョン4.2.0、mongoose 4.4.7、mongodb 3.2.9(私はmlabを使用しています)を使用しています。

+2

あなたはユニークなインデックスを追加するか疎をセットするときにコレクションを削除する必要がありますか?それは100%偽です。 – sergiuz

+1

このインデックスを適用するために使用しているコードを提供できますか?インデックスを適用するためにコレクションを削除する必要はありません。 – pieperu

+0

インデックスフィールドが新しいドキュメントにある場合は、コレクション全体を削除する必要はありません。新しい文書と古い文書を共有できますか? – rushUp

答えて

0

スキーマに変更があった場合は、コレクションを削除して再作成する必要はありません。

詳細:

スパースインデックスは唯一のインデックスフィールドはNULL値が含まれている場合でも、インデックスフィールドを持つ文書のためのエントリを含みます。索引は、索引付きフィールドが欠落している文書をスキップします。索引は、コレクションのすべての文書を含んでいないため、「疎」です。対照的に、非疎インデックスはコレクション内のすべてのドキュメントを含み、インデックス付きフィールドを含まないドキュメントにはnull値を格納します。

スパースインデックスと不完全な結果

まばらなインデックスがクエリやソート操作のために設定され、不完全な結果につながる場合、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

はそれが役に立てば幸い!

関連する問題