복붙노트

[MONGODB] MongoDB를하고 드라이버는 문서 요소의 순서를 보존 할 수 있습니다

MONGODB

MongoDB를하고 드라이버는 문서 요소의 순서를 보존 할 수 있습니다

나는 키 / 값 쌍의 목록을 포함하는 문서를 저장하기 위해 MongoDB의 사용을 고려하고있다. 이 문제를 저장하는 안전하지만 추한 비 대한 방법은 같다

[ ['k1' : 'v1'] , ['k2' : 'v2'],  ...]

그러나 문서 요소는 본질적 때문에 원칙적으로 기본 BSON 데이터 구조 내에서 정렬 :

{k1 : 'v1', 
 k2 : 'v2',  ...}

충분합니다. 그러나 나는 대부분의 언어 바인딩은 연관 배열 이러한 해석 할 것으로 예상, 따라서 잠재적으로 순서를 스크램블. 내가 알아야 할 것은 그래서 :

나는 대부분 여기에 자바 스크립트와 PHP에 관심이 있어요,하지만 난 다른 언어에 대해 알고 싶습니다. 어떤 도움을 주시면 감사, 또는 내가 RTM을 갈 수있는 몇 가지 문서에 바로 링크됩니다.

해결법

  1. ==============================

    1.에 버전 2.6에서 MongoDB를 가능한 필드의 순서를 유지합니다. 그러나, _id 필드는 항상 이름을 변경 필드 순서 변경 될 수 있습니다 먼저. 그러나, 나는 일반적으로 같은 세부에 의존하지 않으려 것입니다. 원래의 질문에 언급 된 바와 같이, 각 주문의 안정성을 보장 어떤 종류의를 제공해야하는 고려할 추가 레이어가 있습니다 ...

    에 버전 2.6에서 MongoDB를 가능한 필드의 순서를 유지합니다. 그러나, _id 필드는 항상 이름을 변경 필드 순서 변경 될 수 있습니다 먼저. 그러나, 나는 일반적으로 같은 세부에 의존하지 않으려 것입니다. 원래의 질문에 언급 된 바와 같이, 각 주문의 안정성을 보장 어떤 종류의를 제공해야하는 고려할 추가 레이어가 있습니다 ...

    원래 답변 :

    아니, MongoDB를이 필드의 순서에 대한 보증을하지 않습니다

    특히, 현재 위치에서 업데이트에서 문서 크기는 일반적으로 필드의 순서를 변경합니다 변경하는 것이. 예를 들어, 당신은 그 이전 값 유형 번호의이고 새 값이 NumberLong으로하고, 필드 일반적으로 얻을 다시 정렬 필드를 설정 $합니다.

    그러나, 배열이 제대로 주문 보존 :

    [ {'key1' : 'value1'}, {'key2' : 'value2'}, ... ]
    

    나는이 "추한"와 "비 대한이"전혀 이유를 볼 수 없습니다. 복잡한 객체의 목록을 저장하는 것은 쉬울 수 없었다. 그러나,리스트 물체 남용 확실히 추한 :리스트 / 배열되지 않지만 개체 (즉, 단지 주어진 이름 필드 중 하나가 될 수있다) 연관 배열 의미를 가지고

    // 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를 객체 데이터베이스가 아닌 키 / 값 저장소 있음을 유의하십시오.

  2. ==============================

    2.몽고 2.6.1로, 그것은 당신의 필드의 순서를 유지합니까 :

    몽고 2.6.1로, 그것은 당신의 필드의 순서를 유지합니까 :

    http://docs.mongodb.org/manual/release-notes/2.6/#insert-and-update-improvements

  3. ==============================

    3.이의 고통 점 중 하나는 쉘에서 서로 문서를 비교한다.

    이의 고통 점 중 하나는 쉘에서 서로 문서를 비교한다.

    나는 그들이 너무 적어도 당신이 쉘에서 분명 무슨 일이 일어나고 있는지 볼 수 있습니다 인쇄 할 때 당신을 위해 기본적으로 문서 키를 정렬 사용자 정의 mongorc.js을 만드는 프로젝트를 만들었습니다. 당신이 그것을 소용돌이를주고 싶은 경우는 몽고의 해커라고.

  4. ==============================

    4.이 몽고 2.6.1로,이 순서를 유지 않는 것은 사실이지만, 하나는 아직 업데이트 작업에주의해야합니다.

    이 몽고 2.6.1로,이 순서를 유지 않는 것은 사실이지만, 하나는 아직 업데이트 작업에주의해야합니다.

    mattwad 업데이트 일을 재정렬 할 수 있다는 점을 만들지 만, 내가 생각할 수있는 적어도 하나의 다른 문제가있다.

    예를 들어 $의 addToSet 경우 :

    https://docs.mongodb.com/manual/reference/operator/update/addToSet/

    어레이 내에 포함 된 문서에 사용될 때 addToSet $ ​​/ 논의 여기 예시된다 : https://stackoverflow.com/a/21578556/3643190

    포스트에 mnemosyn 값을 비교하여 깊은 값의 요소를 일치시킬 때 $ addToSet이 순서를 무시하는 방법에 대해 설명합니다.

    ($ addToSet에만 기록 할 때있는 거 독특한 추가)

    하나는이 같은 구조 데이터로 결심했다면 이것은 관련 :

    [{key1: v1, key2: v2}, {key1: v3, key2: v4}]
    

    이 같은 업데이트를 (포함 된 문서에 다른 순서를 확인할 수) :

    db.collection.update({_id: "id"},{$addToSet: {field:
    {key2: v2, key1: v1}
    }});
    

    몽고는 배열의 중복 및 NOT이 객체로이 표시됩니다.

  5. from https://stackoverflow.com/questions/8576823/can-mongodb-and-its-drivers-preserve-the-ordering-of-document-elements by cc-by-sa and MIT license