【问题标题】:MongoDB query: Using Limit together with $near skips few documentsMongoDB 查询:将 Limit 与 $near 一起使用会跳过几个文档
【发布时间】:2014-04-28 04:37:13
【问题描述】:

我目前正在开发一个应用程序,如果它们的位置坐标落在某个距离范围内,它会从集合中获取特定数量的文档。我正在使用 Codeigniter 的活动记录库,生成的查询如下

db.updates.find({locs: { $near: [72.844102008984, 19.130207090604 ], $maxDistance: 5000 },  posted_on : { $lt :1398425538.1942 },}).sort( { posted_on: -1 } ).limit(10).toArray()

我面临的问题是上面的查询跳过了一些实际上应该被提取的文档。但是,如果我从上述查询中删除limit(10),那么会提取正确的文档。

我不确定,但是在 MongoDB 中使用 limit() 会忽略一些结果吗?还是仅限于最近(最近)的文档?

P.S - 使用限制跳过的文档并不总是相同的,并且会生成随机结果

【问题讨论】:

    标签: mongodb geospatial


    【解决方案1】:

    我怀疑您遇到了 $near 查询的特殊性质的问题。 $near 在返回结果的游标上同时执行 limit() 和 sort() -

    指定地理空间查询首先返回最近文档的点。查询从最近到最远对文档进行排序。

    默认情况下,使用二维索引的查询返回 100 个文档的限制;但是你可以使用 limit() 来改变结果的数量。

    http://docs.mongodb.org/manual/reference/operator/query/near/

    虽然文档确实专门讨论了用您自己的限制调用覆盖 100 的限制

    您可以使用 cursor.limit() 进一步限制结果数。

    在添加您自己的 sort() 或同时排序和覆盖限制时保持沉默。我怀疑你会遇到两者都做的副作用。请注意,两者都做并不是错误的 - 它可能不会产生您正在寻找的结果。我建议使用 $geoWithin

    尝试相同的查询

    http://docs.mongodb.org/manual/reference/operator/query/geoWithin/

    $geoWithin 不对结果应用排序或限制,因此它为您提供了一些更原始的结果集。

    【讨论】:

    • 嗨。我想我得试试$geoWithin。到目前为止,我一直在避免这种情况,因为我正在使用的活动记录库不支持它。所以也许我必须自己写。我会让你知道结果。谢谢
    • 嗨。我尝试从我的查询中删除limit(),希望在任何情况下,Mongo 最多只能返回 100 个文档。但不幸的是,它正在从集合中返回所有(当前为 200 个)文档:( 不知道现在该做什么
    • 我使用了$geoWithin 而不是$near,看起来一切正常。谢谢:)
    【解决方案2】:

    系统中是否有相同的posted_on 日期?我建议按第二个键排序,也许是 _id。如果排序顺序是不确定的,则系统可能会以不确定的方式跳过文档。如果您在其他字段上有索引,则将 _id 字段添加到您的排序顺序通常不会那么昂贵,因为它们已经非常接近正确的顺序并且 _id 是所有索引的一部分。 (“默认情况下,所有集合的_id字段都有一个索引,应用程序和用户可以添加额外的索引来支持重要的查询和操作。”http://docs.mongodb.org/manual/core/index-single/

    【讨论】:

    • 嗨..不,相同的posted_on日期的可能性太小,因为它以微秒格式存储。我目前只有 locs 字段的 2d 索引。所以假设如果我按_id 排序,那么它实际上是否按该文档的创建时间排序?
    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 2020-11-24
    • 2014-03-06
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多