在特定索引中插入mongodb雀巢元素
我不确定这是否可能。我有一本在特定索引中插入mongodb雀巢元素,mongodb,sorting,nested,Mongodb,Sorting,Nested,我不确定这是否可能。我有一本书籍收藏,数据结构如下 { "_id" : ObjectId("6539d19532f73ad544000001"), "name" : "PHP", "books" : [ {"author": "jim", "title" : "Book1", "price":"200"}, {"author": "joe", "title" : "Book2", "price":"300"}, {"auth
书籍
收藏,数据结构如下
{
"_id" : ObjectId("6539d19532f73ad544000001"),
"name" : "PHP",
"books" : [
{"author": "jim", "title" : "Book1", "price":"200"},
{"author": "joe", "title" : "Book2", "price":"300"},
{"author": "amy", "title" : "Book3", "price":"500"}
]
}
现在我想在books部分插入一个新对象。对象类似于{“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"}
]
}
MongoDB不允许在特定位置插入嵌套数组元素。只能使用
$push
将其添加到末尾。您真正需要做的是重构您的模式。您可以单独存储每本书,并添加关键字PHP:
{ "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 }
(我省略了\u id
字段)
然后,在检索书籍时,您始终可以进行排序:
db.collection.find( { name: "PHP" } ).sort( { price: 1 } );
另外一个好处是,您现在不必修改文档(当然,除非价格发生变化)。不让文档通过添加元素而增长是一个很好的性能改进。每个名称(PHP
)的文档数量现在也不受限制,因为嵌套的books数组的总大小限制为16MB(MongoDB文档大小限制)
还请确保将价格存储为数字(
500
),而不是字符串(“500”
)。以后用它进行计算会容易得多。是的,我能做到。因此,无法在特定位置插入对象。