MongoDB限制字段和切片投影在一起

时间:2014-05-22 10:29:18

标签: javascript node.js mongodb mongoose mongodb-query

我有以下用户对象:

{
  "_id" : ObjectId("someId"),
  "name" : "Bob",
  "password" : "fakePassword",
  "follower" : [...],
  "following" : [..]
}

我需要对关注者列表进行分页,所以我使用切片投影运算符,但我只需要返回分页的关注者列表。而且我不知道我是否采用了错误的方式,或者无法完成,但限制字段不适用于切片投影。

以下是我尝试的几个问题:

 collection.findOne(
          {
            _id: new ObjectId(userId)
          },
          {
            follower: {$slice:[skip, parseInt(pageSize)]},
            follower: 1
          },..

collection.findOne(
          {
            _id: new ObjectId(userId)
          },
          {
            follower: 1,
            follower: {$slice:[skip, parseInt(pageSize)]}
          },

但是这些返回对象中的所有值,并且不限制字段,尽管切片在两种情况下都能正常工作。 此外,当我执行类似_id:0,following:0的操作时,此部分可以正常工作,但我不想像这样提及查询中的每个字段,一旦我决定更改架构,它可能会产生问题。 我如何使这个工作,查询的语法可能是什么工作.. ??

2 个答案:

答案 0 :(得分:3)

不确定我是否在此处获取您的使用模式。也许我们可以稍微简化一下这个例子。所以考虑一下这个文件:

{
    "_id" : ObjectId("537dd763f95ddda3208798c5"),
    "name" : "Bob",
    "password" : "fakePassword",
    "follower" : [
            "A",
            "B",
            "C",
            "D",
            "E",
            "F",
            "G",
            "H",
            "I",
            "J",
            "K"
    ]
}

所以像这样的简单查询:

db.paging.find(
    { "name": "Bob" },
    { 
        "_id": 0, 
        "name": 0, 
        "password": 0, 
        "follower": { "$slice": [0,3] } 
}).pretty()

给出结果:

{
    "follower" : [
            "A",
            "B",
            "C"
    ]
}

类似于以下页面:

db.paging.find(
    { "name": "Bob" },
    { 
        "_id": 0, 
        "name": 0, 
        "password": 0, 
        "follower": { "$slice": [3,3] } 
}).pretty()

给出结果:

{ 
    "follower" : [ 
        "D", 
        "E", 
        "F" 
    ]
}

所以对我个人来说,我不确定你是否在询问有关字段排除的问题,或者你是否在询问"分页"数组结果,但不管怎样,这两个例子都显示在这里。

答案 1 :(得分:2)

一种方法是通过说{_id:1}来实际使用_id:

{ "_id" : ObjectId("537de1bc08eb9d89a7d3a1b2"), "f" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20 ], "d" : 1 }
> db.test.findOne({ "_id" : ObjectId("537de1bc08eb9d89a7d3a1b2")},{f:{$slice:[0,2]}})
{
        "_id" : ObjectId("537de1bc08eb9d89a7d3a1b2"),
        "f" : [
                1,
                2
        ],
        "d" : 1
}
> db.test.findOne({ "_id" : ObjectId("537de1bc08eb9d89a7d3a1b2")},{_id:0, f:{$slice:[0,2]}})
{ "f" : [ 1, 2 ], "d" : 1 }
> db.test.findOne({ "_id" : ObjectId("537de1bc08eb9d89a7d3a1b2")},{_id:1, f:{$slice:[0,2]}})
{ "_id" : ObjectId("537de1bc08eb9d89a7d3a1b2"), "f" : [ 1, 2 ] }