Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB将限制字段和切片投影放在一起_Javascript_Node.js_Mongodb_Mongoose_Mongodb Query - Fatal编程技术网

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

Javascript MongoDB将限制字段和切片投影放在一起,javascript,node.js,mongodb,mongoose,mongodb-query,Javascript,Node.js,Mongodb,Mongoose,Mongodb Query,我有以下用户对象: { "_id" : ObjectId("someId"), "name" : "Bob", "password" : "fakePassword", "follower" : [...], "following" : [..] } 我需要在跟随者列表上分页,所以我使用切片投影操作符,但我只需要返回分页的跟随者列表。我不知道我是否用了错误的方法,或者这是不可能的,但是极限场不适用于切片投影 以下是我尝试过的几个问题: collection.findOne

我有以下用户对象:

{
  "_id" : ObjectId("someId"),
  "name" : "Bob",
  "password" : "fakePassword",
  "follower" : [...],
  "following" : [..]
}
我需要在跟随者列表上分页,所以我使用切片投影操作符,但我只需要返回分页的跟随者列表。我不知道我是否用了错误的方法,或者这是不可能的,但是极限场不适用于切片投影

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

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

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

我不确定这里是否有您的使用模式。也许我们可以把这个例子简化一点。因此,考虑到该文件:

{
“_id”:ObjectId(“537dd763f95ddda3208798c5”),
“姓名”:“鲍勃”,
“密码”:“伪造密码”,
“追随者”:[
“A”,
“B”,
“C”,
“D”,
“E”,
“F”,
“G”,
“H”,
“我”,
“J”,
“K”
]
}
下面是一个简单的查询:

db.paging.find(
{“姓名”:“鲍勃”},
{ 
“_id”:0,
“名称”:0,
“密码”:0,
“跟随者”:{“$slice”:[0,3]}
}).pretty()
给出了以下结果:

{
“追随者”:[
“A”,
“B”,
“C”
]
}
同样,在下一页:

db.paging.find(
{“姓名”:“鲍勃”},
{ 
“_id”:0,
“名称”:0,
“密码”:0,
“跟随者”:{“$slice”:[3,3]}
}).pretty()
给出了结果:

{
“跟随者”:[
“D”,
“E”,
“F”
]
}

因此,就我个人而言,我不确定您是询问字段排除还是询问数组结果的“分页”,但无论哪种方式,这两个示例都显示在这里。

一种方法是在这里实际使用{u id:1}:

{ "_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 ] }

就像在你的回答中一样,你必须定义你需要删除的所有字段,但是根据mongodb文档,你也可以指定你需要的字段,比如
followers:1
,这样我就可以得到followers字段和_id字段,我不必指定我不需要的所有其他字段。我需要这个来处理切片投影操作符。@SambhavSharma如果这是你真正的问题,那么我将很高兴地提交文档补丁(已经是一个贡献者),但是没有,这实际上不起作用。使用
$slice
时,需要明确排除所有不需要的字段。您也不能在
.find()
下混合包含和排除,如果您需要这种复杂性,那么您可以使用运算符。我认为这应该是正确的答案。另外,如果您绝对不想要_id,您可以设置_id:0和一些不存在的_字段:1。不过,在返回的文档中包含_id似乎不太可能是个问题。还有一件事;如果要在子文档(如sub_doc.my_数组:{$slice…})中进行切片,则需要在该级别选择一个不存在的字段,如sub_doc.nonexistant_field:1,以防止获取的不仅仅是切片
{ "_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 ] }