【问题标题】:Getting array of object with limit and offset doesn't work using mongodb使用 mongodb 获取具有限制和偏移量的对象数组不起作用
【发布时间】:2018-02-16 09:01:50
【问题描述】:

首先让我说我是mongodb 的新手。我正在尝试从集合中获取数据 这是我收藏的学生中的文档:

{
    "_id" : ObjectId("5979e0473f00003717a9bd62"),
    "id" : "l_7c0e37b9-132e-4054-adbf-649dbc29f43d",
    "name" : "Raj",
    "class" : "10th",
    "assignments" : [ 
        {
            "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc571",
            "name" : "1"
        }, 
        {
            "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc572",
            "name" : "2"
        }, 
        {
            "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc573",
            "name" : "3"
        }, 
        {
            "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc574",
            "name" : "4"
        }, 
        {
            "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc575",
            "name" : "5"
        }, 
        {
            "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc576",
            "name" : "6"
        }
    ]
}

我需要的输出是

{
   "assignments" : [ 
            {
                "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc571",
                "name" : "1"
            }, 
            {
                "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc572",
                "name" : "2"
            }, 
            {
                "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc573",
                "name" : "3"
            }, 
            {
                "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc574",
                "name" : "4"
            }, 
            {
                "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc575",
                "name" : "5"
            }, 
            {
                "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc576",
                "name" : "6"
            }
        ]
}

对于这个回复,我使用了以下查询

db.getCollection('student').find({},{"assignments":1})

现在我正在尝试对我尝试使用 $slice:[0,3] 的 cmets 列表应用限制和偏移量,但它给了我整个文档和切片结果 但不是单独的分配,所以我如何将这两者结合起来才能只获得具有限制和偏移的分配。

【问题讨论】:

    标签: mongodb limit slice offset


    【解决方案1】:

    您需要aggregate 而不是find,因为aggregate 允许您投影+切片。

    鉴于您的问题中的文档,以下命令...

    db.getCollection('student').aggregate([
        // project on assignments and apply a slice to the projection
        {$project: {assignments: {$slice: ['$assignments', 2, 5]}}}
    ])
    

    ...返回:

    {
        "_id" : ObjectId("5979e0473f00003717a9bd62"),
        "assignments" : [ 
            {
                "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc573",
                "name" : "3"
            }, 
            {
                "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc574",
                "name" : "4"
            }, 
            {
                "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc575",
                "name" : "5"
            }, 
            {
                "id" : "v_539f65c2-9f45-4d92-b05e-973cf08cc576",
                "name" : "6"
            }
        ]
    }
    

    这表示assignments 数组(并且assignments 数组),其中包含从元素 2 到 5 的切片。您可以更改切片参数(在上面的示例中为 2, 5)应用您自己的偏移量和限制(其中第一个参数是偏移量,限制是第一个和第二个参数之间的差异)。

    如果您想在上面添加匹配条件(以处理特定文档),那么您可以执行以下操作:

    db.getCollection('other').aggregate([
        /// match a specific document
        {$match: {"_id": ObjectId("5979e0473f00003717a9bd62")}},
        // project on assignments and apply a slice to the projection
        {$project: {assignments: {$slice: ['$assignments', 2, 5]}}}
    ])
    

    关于匹配步骤的更多详细信息here

    【讨论】:

    • 感谢您的回答,这很有效。但是如何在同一个查询中使用 find 意味着这个查询给了我集合中的所有文档,但是如果我想要那个特定的文档意味着像某个唯一的 id。
    • 您是在问如何找到项目吗?如果是这样,那么我已经更新了答案以显示 $match 阶段的使用。
    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 2022-01-19
    • 2014-07-25
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    相关资源
    最近更新 更多