2013-08-06 1 views
0

이것이 가능한지 확실하지 않습니다. 다음과 같이 데이터 구조가있는 books 컬렉션이 있습니다.특정 색인에 mongodb nestle 요소를 삽입하십시오.

{ 
    "_id" : ObjectId("6539d19532f73ad544000001"), 
    "name" : "PHP", 
    "books" : [ 
     {"author": "jim", "title" : "Book1", "price":"200"}, 
     {"author": "joe", "title" : "Book2", "price":"300"}, 
     {"author": "amy", "title" : "Book3", "price":"500"} 
    ] 
} 

이제 책 섹션에 새 개체를 삽입하고 싶습니다. 객체는 {"author": "amy", "title" : "Book4", "price":"400"}과 같습니다. 그래서 가격이 500보다 낮기 때문에 Book3 앞에 그 오브젝트를 삽입하고 싶습니다. 그래서 내 마지막 대상은 어떻게 든 아래처럼 보입니다.

{ 
    "_id" : ObjectId("6539d19532f73ad544000001"), 
    "name" : "PHP", 
    "books" : [ 
     {"author": "jim", "title" : "Book1", "price":"200"}, 
     {"author": "joe", "title" : "Book2", "price":"300"}, 
       {"author": "amy", "title" : "Book4", "price":"400"} 
     {"author": "amy", "title" : "Book3", "price":"500"} 
    ] 
} 

답변

1

MongoDB에서는 중첩 배열 요소를 특정 위치에 삽입 할 수 없습니다. $push으로 끝 부분 만 추가 할 수 있습니다. 정말로해야 할 일은 스키마를 재구성하는 것입니다. 그런 다음

(거기에서 내가 생략 한 _id 필드)

{ "name" : "PHP", "author": "jim", "title" : "Book1", "price": 200 } 
{ "name" : "PHP", "author": "joe", "title" : "Book2", "price": 300 } 
{ "name" : "PHP", "author": "amy", "title" : "Book3", "price": 500 } 
{ "name" : "PHP", "author": "amy", "title" : "Book4", "price": 400 } 

을 수행 할 수 있습니다 : 대신 중첩 된 배열의 모든 PHP 책을 저장하는, 당신은 단지 개별적으로 각각의 책을 저장하고, 키워드 PHP를 추가 할 수 있습니다 책을 검색 할 때 언제나 정렬을 수행합니다

db.collection.find({ name: "PHP" }).sort({ price: 1 }); 

또 다른 이점은 당신이 지금 문서를 수정 (물론 가격 변경하지 않는 한) 할 필요가 없다는 것입니다. 요소를 추가하여 문서가 커지게하지 않는 것이 성능을 향상시키는 좋은 방법입니다. 중첩 된 서적 배열이 총 16MB (MongoDB 문서 크기 제한)로 제한되었으므로 이름 당 문서 수 (PHP)도 무제한입니다.

가격을 숫자 (500)로 저장하고 문자열 ("500")이 아닌 값으로 저장하십시오. 나중에 계산을하는 것이 훨씬 쉽습니다.

+0

예, 할 수 있습니다. 따라서 특정 위치에 객체를 삽입 할 수있는 방법은 없습니다. – deepakb

관련 문제