2013-08-06 65 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