복붙노트

[MONGODB] 객체 중첩 대 몽구스 채우기

MONGODB

객체 중첩 대 몽구스 채우기

몽구스의 인구와 직접 객체 포함을 사용 사이의 성능 차이 (쿼리의 처리 시간)이 있습니까? 때마다 사용되어야 하는가?

몽구스 인구 예 :

var personSchema = Schema({
  _id     : Number,
  name    : String,
  stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});

var storySchema = Schema({
  _creator : { type: Number, ref: 'Person' },
  title    : String,
});

몽구스는 중첩 예를 객체 :

var personSchema = Schema({
  _id     : Number,
  name    : String,
  stories : [storySchema]
});

var storySchema = Schema({
  _creator : personSchema,
  title    : String,
});

해결법

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

    1.몽구스 인구에 대해 이해하는 첫 번째 점은 마법되지 않는 것입니다,하지만 당신은 자신을 다하지 않고 관련 정보를 검색 할 수 있습니다 단지 편리한 메소드입니다.

    몽구스 인구에 대해 이해하는 첫 번째 점은 마법되지 않는 것입니다,하지만 당신은 자신을 다하지 않고 관련 정보를 검색 할 수 있습니다 단지 편리한 메소드입니다.

    개념은 당신이 분리 수거에 장소 데이터를 필요에가는 것이 아니라 데이터를 내장하고 주요 고려 사항은 문서 크기에 일반적이거나해야하는 결정 사용을위한 본질적 곳 관련 정보 만들 것 자주 업데이트의 적용을받습니다 매립 된 데이터를 다루기 유지.

    은 "마법하지"부분은 본질적으로 무엇을 내부적으로 발생하는 것이 있다는 것을 당신은 "참조"다른 소스는 채우기 기능은 부모의 "병합"그 결과를 위해 그 "관련"컬렉션에 추가 쿼리 / 쿼리를 보낼 때 당신이 검색 한 객체. 당신이 스스로 할 수 있지만 방법은 작업을 단순화하기 편리하다. 명백한 "성능"고려 사항은 모든 정보를 검색하기 위해 데이터베이스 (MongoDB의 인스턴스)에 하나의 왕복이되지 않는 것입니다. 항상 하나 이상의있다.

    샘플로, 두 개의 컬렉션을 :

    { 
        "_id": ObjectId("5392fea00ff066b7d533a765"),
        "customerName": "Bill",
        "items": [
            ObjectId("5392fee10ff066b7d533a766"),
            ObjectId("5392fefe0ff066b7d533a767")
        ]
    }
    

    그리고 항목 :

    { "_id": ObjectId("5392fee10ff066b7d533a766"), "prod": "ABC", "qty": 1 }
    { "_id": ObjectId("5392fefe0ff066b7d533a767"), "prod": "XYZ", "qty": 2 }
    

    은 "참조"모델이나 (후드) 채우기를 사용하여 수행 할 수있는 "최고"이것이다 :

    var order = db.orders.findOne({ "_id": ObjectId("5392fea00ff066b7d533a765") });
    order.items = db.items.find({ "_id": { "$in": order.items } ).toArray();
    

    그래서 "적어도"두 개의 질의 및 운영은 "가입"데이터를 위해 분명히있다.

    매입 개념은 기본적으로 지원하지 않는 처리하는 방법에 MongoDB의 응답 1을 "조인". 그래서 정규화 된 컬렉션에 분할 데이터는 당신이 시도하지 않고 있음 사용을하는 문서 내에서 직접 "관련"데이터를 포함합니다. 여기 장점은에 쓸 수 있지만 종종 가능 모두 업데이트 "부모"를 "쓰기"운영 및 "아이"항목의 단일 지점이없는 하나는 "관련"정보를 검색하는 작업을 "읽기", 그리고 것이있다 "다"어린이 받아들이는 달리 클라이언트에서 "목록"을 처리 유무에 관계없이 한 번 "여러"쓰기 작업에서, 바람직에서 "배치"처리.

    데이터는 오히려 (위의 예와 비교하여) 다음과 같습니다 :

    { 
        "_id": ObjectId("5392fea00ff066b7d533a765"),
        "customerName": "Bill",
        "items": [
            { "_id": ObjectId("5392fee10ff066b7d533a766"), "prod": "ABC", "qty": 1 },
            { "_id": ObjectId("5392fefe0ff066b7d533a767"), "prod": "XYZ", "qty": 2 }
        ]
    }
    

    따라서 실제로 데이터를 가져 오는 것은 단지 문제입니다 :

    db.orders.findOne({ "_id": ObjectId("5392fea00ff066b7d533a765") });
    

    하나의 장점과 단점은 항상 크게 응용 프로그램의 사용 패턴에 따라 달라집니다. 그러나 한 눈에 :

    그래서이 실제로 다양한 사용 사례 및 중 하나를 채우기 방법으로 지원으로 내장 또는 참조 모델을 사용하여 접근 할 수있는 방법을 설명합니다 데이터 모델링에 MongoDB를 문서에 어느 위치에 대한 "프로 / 단점"의 훨씬 넓은 토론이다.

    바라건대 "점 점"사용하지만 일반적으로 권장 응용 프로그램의 데이터 사용 패턴을 고려하여 가장 적합한 것을 선택하는 것입니다. 삽입에 "옵션"을 갖는 것은 당신이 MongoDB를을 선택한 이유 "해야한다",하지만 실제로 응용 프로그램이 결정한다 "데이터를 사용하여"어떻게 될 것입니다 데이터의 일부를 모델링하는 적합한 방법 (그렇지 않은으로 "모두 또는 아무것도") 최고.

  2. from https://stackoverflow.com/questions/24096546/mongoose-populate-vs-object-nesting by cc-by-sa and MIT license