mongodb - 如何对集合中的数组进行排序

标签 mongodb symfony doctrine-mongodb

我一直在寻找对集合中特定内部数组进行排序的方法,我在 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/

相关文章:

php - 这个 Mongo 查询和这个 SQL 查询一样吗?我是否正确地考虑了 Mongo?

mongodb - mongorestore 需要很多时间,我只是复制粘贴 '/data/db' 目录怎么样?

mongodb - 使用 MongoDB 进行嵌套分组

mongodb - 在 Ubuntu 中使用 shell 脚本更新 YAML 文件

file - 如何在 Symfony 中创建下载文件的链接

交响乐2 : How do I check if a user is not logged in inside a template?

symfony - 尝试执行查询时路径表达式无效

mongodb - 试图从命名空间 "ObjectID"加载类 "MongoDB\BSON"

mongodb - 如何注释 Doctrine MongoDB 中的子文档?

php - ClassNotFoundException : Attempted to load class "Mongo" from. .. (with persist) symfony2