バージョン2.6以降、 MongoDBは、可能な場合、フィールドの順序を保持します。
ただし、_id
フィールドは常に最初に来ます。フィールドの名前を変更すると、並べ替えにつながる可能性があります。しかし、私は通常、このような詳細に依存しないようにします。元の質問が述べているように、注文の安定性のためにそれぞれが何らかの保証を提供しなければならないことを検討するための追加のレイヤーもあります...
元の回答:
いいえ、MongoDB は、フィールドの順序について保証しません :
特に、ドキュメントサイズを変更するインプレース更新では、通常、フィールドの順序が変更されます。たとえば、$set
古い値がnumber型で、新しい値がNumberLong
であるフィールド 、フィールドは通常、並べ替えられます。
ただし、配列は順序を正しく保持します:
[ {'key1' : 'value1'}, {'key2' : 'value2'}, ... ]
なぜこれが「醜い」「肥大化」しているのか全くわかりません。複雑なオブジェクトのリストを保存するのは簡単ではありません。ただし、オブジェクトをリストとして悪用することは間違いなく醜いです。オブジェクトには連想配列のセマンティクスがあります(つまり、指定された名前のフィールドは1つしか存在できません)が、リスト/配列にはありません:
// not ok:
db.foo2.insert({"foo" : "bar", "foo" : "lala" });
db.foo2.find();
{ "_id" : ObjectId("4ef09cd9b37bc3cdb0e7fb26"), "foo" : "lala" }
// a list can do that
db.foo2.insert({ 'array' : [ {'foo' : 'bar'}, { 'foo' : 'lala' } ]});
db.foo2.find();
{ "_id" : ObjectId("4ef09e01b37bc3cdb0e7fb27"), "array" :
[ { "foo" : "bar" }, { "foo" : "lala" } ] }
MongoDBはオブジェクトデータベースであり、キー/値ストアではないことに注意してください。