2

値をmongoコレクションに更新するたびにそれを見てきました。更新後、キーをアルファベット順に再配置します。現在のスキーマが

  _id:"Objectid(blah blah)"
     id: "1", 
fullname: "user",
 username: "username", 
password: "password",

更新後は

 _id:"Objectid(blah blah)"
    fullname:"user"
    id:"1"
    password:"password"
    username:"user"

私はこれに問題がないことを知っています。配列データは値に対応したままなので、これは何にも影響しません。しかし、なぜこれが起こるのか知りたいだけです。

編集:

これはmongoshellの更新機能コードです。しかし、これは私を助けませんでした

function (query, obj, upsert, multi) {
    assert(query, "need a query");
    assert(obj, "need an object");
    var firstKey = null;
    for (var k in obj) {
        firstKey = k;
        break;
    }
    if (firstKey != null && firstKey[0] == "$") {
        this._validateObject(obj);
    } else {
        this._validateForStorage(obj);
    }
    if (typeof upsert === "object") {
        assert(multi === undefined, "Fourth argument must be empty when specifying upsert and multi with an object.");
        opts = upsert;
        multi = opts.multi;
        upsert = opts.upsert;
    }
    this._db._initExtraInfo();
    this._mongo.update(this._fullName, query, obj, upsert ? true : false, multi ? true : false);
    this._db._getExtraInfo("Updated");
}
4

1 に答える 1

2

ドキュメントは、ドキュメントサイズが割り当てられたサイズよりも大きくなると並べ替えられると言っていますが、ドキュメントサイズが変更されるたびに並べ替えられるようです(これが同じサイズの場合は変更されません)。

たとえば、ここでは最初のコマンドは変更されませんが、2番目のコマンドは変更されます。

> db.t3.insert({_id : 1234',id:'xxx',
fullname:'use1',password:'password','username':'user'})
> db.t3.update({'_id':'1234'},{$set : {fullname:'use1'}})
> db.t3.findOne()
{
    "_id" : "1234",
    "id" : "xxx",
    "fullname" : "use1",
    "password" : "password",
    "username" : "user"
}
> db.t3.update({'_id':'1234'},{$set : {fullname:'use11'}})
> db.t3.findOne()
{
    "_id" : "1234",
    "fullname" : "use11",
    "id" : "xxx",
    "password" : "password",
    "username" : "user"
}

こちらをご覧くださいhttps://jira.mongodb.org/browse/SERVER-2592

于 2013-03-16T23:08:51.843 に答える