我有以下用户对象:
{
"_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
的操作时,这部分有效,但我不想像这样提及查询中的每个字段,一旦我决定,它可能会产生问题更改架构。
我如何让它工作,查询的语法是什么才能让它工作..??
最佳答案
不确定我在这里是否了解您的使用模式。也许我们可以稍微简化一下这个例子。因此考虑该文档:
{
"_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"
]
}
因此,就我个人而言,我不确定您是在询问字段排除还是在询问“分页”数组结果,但无论哪种方式,这两个示例都显示在此处。
关于javascript - MongoDB 将字段和切片投影限制在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23804254/