【问题标题】:How can paging in nested array Mongodb如何在嵌套数组Mongodb中进行分页
【发布时间】:2015-06-19 06:33:34
【问题描述】:

我想在结构中进行分页。参数为 id = 558186caa6df1a2194422949 和 Question 为 = 55818779a6df1a219442294d 并获取 Question 数据源中的前 2 行。

我该如何解决?

以下是MongoDB文档结构:

/* 1 */
{
    "_id" : ObjectId("558186caa6df1a2194422949"),
    "Questions" : [ 
        {
            "_id" : ObjectId("55818779a6df1a219442294d"),
            "DataSource" : [ 
                {
                    "_id" : ObjectId("55818796a6df1a2194422950"),
                    "Text" : "Q1-1",
                    "Value" : "Q1-1"
                }, 
                {
                    "_id" : ObjectId("5581879aa6df1a2194422951"),
                    "Text" : "Q1-2",
                    "Value" : "Q1-2"
                }, 
                {
                    "_id" : ObjectId("5581879ea6df1a2194422952"),
                    "Text" : "Q1-3",
                    "Value" : "Q1-3"
                }
            ]
        }, 
        {
            "_id" : ObjectId("55818774a6df1a219442294c"),
            "DataSource" : [ 
                {
                    "_id" : ObjectId("55818788a6df1a219442294e"),
                    "Text" : "Q2-1",
                    "Value" : "Q2-1"
                }, 
                {
                    "_id" : ObjectId("5581878fa6df1a219442294f"),
                    "Text" : "Q2-2",
                    "Value" : "Q2-2"
                }
            ]
        }
    ],
    "Name" : "test"
}

【问题讨论】:

    标签: arrays mongodb-query


    【解决方案1】:

    挑战在于,在数组中产生匹配的数组上的常规 find() 运算符将返回 whole array ,因此查询 Questions._Id = 55818779a6df1a219442294d 将产生整个 Questions 数组,包括第二项 55818774a6df1a219442294c 您可能不想处理。

    您可以使用聚合管道和$unwind 来“挖掘”数组的数组,然后最终使用$skip$limit 阶段来实现您寻求的分页,如下所示:

        db.foo.aggregate([
        {$match: { "_id": ObjectId("558186caa6df1a2194422949") }}
        ,{$unwind: "$Questions"}
        ,{$match: { "Questions._id": ObjectId("55818779a6df1a219442294d") }}  
        ,{$unwind: "$Questions.DataSource"}
        ,{$skip: 1}
        ,{$limit: 2}
                          ]);
    

    一般来说,必须小心使用多个$unwind 运算符,因为这可能会导致数据爆炸,但在这里,我们的第一个$match 始终会生成一个文档,因为_id 是唯一的。第二个$match 似乎也显着减少了输入集,因此第二个$unwind 可能处理要跳过和限制的订单100 或1000 个数据源项,而不是数百万。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      相关资源
      最近更新 更多