Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在特定索引中插入mongodb雀巢元素_Mongodb_Sorting_Nested - Fatal编程技术网

在特定索引中插入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”
)。以后用它进行计算会容易得多。

是的,我能做到。因此,无法在特定位置插入对象。