作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在寻找对集合中特定内部数组进行排序的方法,我在 symfony2 中使用了 doctrine-mongodb-bundle。我的收藏:
"page":
{
"_id": "56rgt46rt54h68rt4h6"
"categories":
[{
"_id": "2g56rt1h65rt165165erg4"
"products":[
{"name":"A", "pos": 2},
{"name":"B", "pos": 7},
{"name":"C", "pos": 1},
{"name":"D", "pos": 5}
]
}]
}
我希望我有:
"page":
{
"_id": "56rgt46rt54h68rt4h6"
"categories":
[{
"_id": "2g56rt1h65rt165165erg4"
"products":[
{"name":"C", "pos": 1},
{"name":"A", "pos": 2},
{"name":"D", "pos": 5},
{"name":"B", "pos": 7}
]
}]
}
还有我的实体:
/**
* @MongoDB\EmbeddedDocument
*/
class Category
{
/**
* @MongoDB\Id(strategy="auto")
*/
protected $id;
/**
* @MongoDB\String
*/
protected $name;
/** @MongoDB\EmbedMany(targetDocument="\Document\Product") */
private $products = array();
}
/**
* @MongoDB\EmbeddedDocument
*/
class Product
{
/**
* @MongoDB\Int
*/
protected $pos;
/**
* @MongoDB\String
*/
protected $name;
}
我是 DoctrineMongoDBBundle 的新手,累积内部数组 (EmbedMany) 可能不是一个好主意,拥有多个集合会更好。所以保存引用。
最佳答案
假设您的 products
数组中的项目是唯一的,没有任何简单的服务器端支持来像 MongoDB 2.4 那样按排序顺序维护此数组。给定嵌套数组的最佳选择是在应用程序逻辑中适本地对数组进行排序(即在插入/更新时,或在检索/显示时)。
如果您需要对嵌套数组条目进行大量操作,您应该考虑扁平化数据模型以使其更易于使用。您使用 MongoDB 的设计目标应该是拥有适合您的应用程序用例的数据模型,并在易于插入/更新/查询之间实现可接受的性能平衡。如果这样做没有意义,您绝对不必在单个集合/查询中对所有内容进行建模,并且您应该准备好对数据进行非规范化(重复)。对于产品 <=> 类别等多对多关系,通常会嵌入和反规范化更新频率较低的实体(例如,在产品中嵌入类别)。
如果您想按排序顺序保存数组并且项不是唯一的,MongoDB 2.4 确实可以选择$push
。到排序数组,但这必须与切片(数组限制)结合使用。如果您 $push
相同的条目到排序数组,您最终会得到重复项(所以这可能不是您想要的)。
示例更新,假设您示例中的 page
是集合名称:
db.page.update(
// Query
{ "_id": "56rgt46rt54h68rt4h6" },
// Update sorted array
// NB: referring by array index position 0, as there isn't a named reference
{ $push : {
"categories.0.products" : {
// List of new elements to push
$each : [
{ "name" : "E", "pos": 3 }
],
// Sort by pos (ascending)
$sort : { "pos" : 1 },
// Maximum number of array elements (required for $sort)
$slice : -100
}
}}
)
关于mongodb - 如何对集合中的数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18655650/
我是一名优秀的程序员,十分优秀!