0

我不确定这是否可能。我有books一个数据结构如下的集合。

{
    "_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"}
    ]
}
4

1 回答 1

1

MongoDB 不允许您在特定位置插入嵌套数组元素。您只能将其添加到末尾$push。你真正需要做的是重构你的模式。PHP您可以单独存储每本书,并添加关键字 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 }

(我_id从那里省略了该字段)

然后你总是可以在检索书籍时进行排序:

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

另一个好处是您现在不必修改文档(当然,除非价格发生变化)。通过添加元素不让文档增长是一个很好的性能改进。每个名称 ( PHP) 的文档数量现在也不受限制,因为嵌套的 books 数组的总大小限制为 16MB(MongoDB 文档大小限制)。

还请确保将价格存储为数字 ( 500),而不是字符串 ( "500")。以后进行计算会容易得多。

于 2013-08-06T14:48:06.357 回答