2013-08-06 97 views
0

我不確定這是否可行。我有一個books集合,其數據結構如下。在特定索引中插入mongodb嵌套元素

{ 
    "_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 }); 

另外一個好處是是,你現在從來沒有修改文件(當然,除非價格的變化)。通過添加元素不讓文檔增長是一個很好的性能改進。每個名稱(PHP)的文檔數目現在也是無限的,因爲嵌套書籍數組限於總共16MB(MongoDB文檔大小限制)。

另請確保您將價格存儲爲數字(500),而不是字符串("500")。稍後進行計算會容易得多。

+0

是的,我可以做到這一點。所以沒有辦法在特定位置插入對象。 – deepakb