使用$ slice检索元素

时间:2014-05-28 05:02:26

标签: php mongodb mongodb-query nosql

执行find()查询后,我的结果如下。

{
    "_id" : ObjectId("5384928a03ea2e75268b4567"),
    "0" : {
        "name" : "mango",
        "quantity" : "10"
     },
    "1" : {
        "name" : "apple",
        "quantity" : "14"
     },
    "2" : {
        "name" : "banana",
        "quantity" : "11"
     },
    "3" : {
        "name" : "grapes",
        "quantity" : "19"
     },
    "4" : {
        "name" : "lichi",
        "quantity" : "13"
     },
    "5" : {
        "name" : "orange",
        "quantity" : "10"
     },
    "6" : {
        "name" : "lemon",
        "quantity" : "10"
     },
    "7" : {
        "name" : "pear",
        "quantity" : "10"
     },
    "8" : {
        "name" : "cherry",
        "quantity" : "10"
     },
    "9" : {
        "name" : "kiwi",
        "quantity" : "10"
    }
}

现在我只想要结果中的任何五个元素(例如从第2个元素到第6个元素)。

如何使用$ slice执行此操作或是否有任何其他方法只能检索结果中的五个元素?

3 个答案:

答案 0 :(得分:1)

这里重要的是,你实际上有一个$slice数组可以工作吗?对于使用PHP的人来说,这似乎有点误解,因为语言通常代表一个数组。

mongo shell(例如)将显示明显的区别,其中数组在其JSON表示中实际上看起来像这样:

{
    "_id" : ObjectId("5384928a03ea2e75268b4567"),
    "arrayField": [
        {
            "name" : "mango",
            "quantity" : "10"
        },
        {
            "name" : "apple",
            "quantity" : "14"
        },
        {
            "name" : "banana",
            "quantity" : "11"
        },
        {
            "name" : "grapes",
            "quantity" : "19"
        }
    ]
}

该结构可以使用$slice运算符返回所需的元素。这里的例子是索引位置1的2个文件

db.collection.find({},{ "arrayField": { "$slice": [ 1,2] }})

{ 
    "_id" : ObjectId("5384928a03ea2e75268b4567"), 
    "arrayField" : [ 
        { "name" : "apple", "quantity" : "14" }, 
        { "name" : "banana", "quantity" : "11" }
    ]
}

您展示的结构只是顶级文档中子文档的一组关键名称。这可能是一个错误,但您只需在投影中指定这些字段。它不是数组,因此$slice不适用:

db.collection.find({}, { "1": 1, "2": 1, "3": 1, "4": 1, "5": 1, "6": 1 })

但这可能不是您想要的,所以看起来您需要修复数据,因此它是一个数组。

答案 1 :(得分:0)

$ slice用于控制查询返回的数组中的元素数,但我没有在结果中看到显式数组。您的文档应如下所示:

{
    "_id" : ObjectId("5384928a03ea2e75268b4567"),
    "fruit" : [
      {
        "name" : "mango",
        "quantity" : "10"
      },
      {
        "name" : "apple",
        "quantity" : "14"
      }
    ]
}

然后你可以用以下内容查询它:     db.collection.find({},{“fruit”:{$ slice:[1:6]}})

答案 2 :(得分:0)

如果你想从文档中只获得5条记录,你可以使用limit(),如果你想跳过一些记录,那么使用skip()。

例如:

  

db.collection.find()跳过(2).limit(5);

此查询在前两个文档之后获取5个文档。