我有以下用户对象:
{
"_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
的操作时,此部分可以正常工作,但我不想像这样提及查询中的每个字段,一旦我决定更改架构,它可能会产生问题。
我如何使这个工作,查询的语法可能是什么工作.. ??
答案 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 ] }