1

我浏览了各种示例,但未能找到我要查找的内容。我想要的是通过 _id 搜索特定文档并使用一个查询在集合之间跳过多次?或者一些对我来说足够快的替代方案。

以下查询将跳过第一个并提前返回第二个:

db.posts.find( { "_id" : 1 }, { comments: { $slice: [ 1, 1 ] } } )

那将是skip 0, return 1,并将其余部分从结果中排除..

但是,如果有 10000 条评论并且我想使用相同的模式,但返回这样的数组值,该怎么办:

skip 0, return 1, skip 2, return 3, skip 4, return 5

所以这将返回集合,其中评论的大小为 5000,因为其中一半被跳过。这可能吗?我应用了像 10000 这样的大数字,因为我担心使用多个查询来应用它不会提高性能......(此处显示的示例:多个查询来完成类似的事情)。谢谢!

4

1 回答 1

0

我浏览了几个资源并得出结论,目前这是不可能通过一个查询来完成的。相反,我同意只有两种选择可以解决这个问题:

1.)进行某种循环并运行多个切片查询,同时增加切片的位置。类似于我链接的资源

var skip = NUMBER_OF_ITEMS * (PAGE_NUMBER - 1)
db.companies.find({}, {$slice:[skip, NUMBER_OF_ITEMS]})

但是,根据数据的类型,我不想运行 5000 个单独的查询来仅获取数组内容的一半,因此我决定使用选项 2。)这对我来说似乎相对较快且性能明智。

2.)对您想要的行进行单个查询,_id然后在将结果返回给客户端或代码的其他部分之前,使用 for 循环跳过不需要的数组项,然后返回结果。自从我通过 morphia 与 mongo 交谈后,我在 java 方面做了这个。我还对 mongo 使用了 query explain() 并了解到在指定条件时返回具有 10000 个项目的数组的单行_id是如此之快,速度并不是真正的问题,我敢打赌切片跳过只会更慢。

于 2013-06-17T10:38:05.063 回答