mongodb - Mongo循环查询

标签 mongodb

我可以运行查询来获取确切的文档数量吗?

我有收藏:


    > db.circle.find()
    { "_id" : 1 }
    { "_id" : 2 }
    { "_id" : 3 }

执行查询:


    > db.circle.find().skip(2).limit(2)
    { "_id" : 3 }

响应 1 个文档,但我需要 2

查看此回复的最佳方式是什么?


    { "_id" : 3 }
    { "_id" : 1 }

最佳答案

我找到了一种使用聚合框架在一个查询中解决此问题的方法:

result = db.circle.aggregate([
    {   
        $project: {
            virtual_id: { $ifNull: [null, [1, 2]] }
            // extra fields go here...
        }
    },
    { $unwind: '$virtual_id' },
    { $sort: { virtual_id: 1, _id: 1 } },

    { $skip: 2 },
    { $limit: 2 }   
]);

这基本上会复制数据集,将其附加到末尾,然后应用跳过和限制操作。

步骤:

  1. $project 添加 virtual_id 字段,并将数组 [1, 2] 作为值添加到每个文档。添加具有静态值的字段的 $ifNull 方法是我在 this answer 中找到的一个很好的技巧。 .

  2. $unwind by virtual_id 使数据集加倍。

  3. $sort 确保两个串联数据集的排序正确。执行此操作后,_id 值为:1, 2, 3, 1, 2, 3

  4. $skip$limit 做显而易见的事情

注释1

如果除了 _id 之外您还需要检索任何其他字段,则应在 $project 操作中指定它们(_id 是默认检索)。例如,要在输出中获取 extra_fieldyet_another_field 的值,请执行以下操作:

        $project: {
            virtual_id: { $ifNull: [null, [1, 2]] },
            extra_field: 1,
            yet_another_field: 1
        }

注释2

此解决方案可能不适合非常大的数据集,因为:

  • 聚合框架的输出大小有限(我认为是 16MB)
  • $sort 操作的成本可能很高,因为无法定义任何索引来覆盖 virtual_id

关于mongodb - Mongo循环查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21040269/

相关文章:

javascript - 如何从 Javascript 中的 JSON 中删除字段?

python - 如何使用 pymongo 从受密码保护的 Mongo 服务器复制数据库?

mongodb - 如何在 MongoDB 中使用 $orderby 和 $limit 更新文档

php - jenssegers 如何将 MongoDB 聚合查询转换为 Laravel MongoDB

mongodb模式设计集合与索引

sql - 在 MongoDb 查询中执行计算

reactjs - 该电子邮件已存在验证

node.js - 彻底关闭 express.js + mongodb 服务器(使用 node.js)

arrays - 查询以使用 mongodb 中同一文档的另一个数组字段更新数组字段

database - MongoDB 中的 findAndModify 和 update 有什么区别?