当前位置: 首页 > 知识库问答 >
问题:

Mongoose限额/抵销和计数查询

苏边浩
2023-03-14

查询性能有点奇怪。。。我需要运行一个查询,该查询对文档进行总计数,还可以返回一个可以限制和偏移的结果集。

所以,我总共有57个文档,用户希望用10个文档抵消20个文档。

我可以想到两种方法,首先是查询所有57个文档(作为数组返回),然后使用array.slice返回他们想要的文档。第二种选择是运行2个查询,第一个使用mongo的本机计数方法,然后使用mongo的本机限制和跳过聚合器运行第二个查询。

你认为哪一个能更好地扩展?在一个查询中完成所有操作,还是运行两个单独的查询?

编辑:

// 1 query
var limit = 10;
var offset = 20;

Animals.find({}, function (err, animals) {
    if (err) {
        return next(err);
    }

    res.send({count: animals.length, animals: animals.slice(offset, limit + offset)});
});


// 2 queries
Animals.find({}, {limit:10, skip:20} function (err, animals) {            
    if (err) {
        return next(err);
    }

    Animals.count({}, function (err, count) {
        if (err) {
            return next(err);
        }

        res.send({count: count, animals: animals});
    });
});

共有3个答案

郦昆
2023-03-14
db.collection_name.aggregate([
    { '$match'    : { } },
    { '$sort'     : { '_id' : -1 } },
    { '$facet'    : {
        metadata: [ { $count: "total" } ],
        data: [ { $skip: 1 }, { $limit: 10 },{ '$project' : {"_id":0} } ] // add projection here wish you re-shape the docs
    } }
] )

而不是使用两个查询来查找总计数并跳过匹配的记录
$facet是最佳的优化方式

  1. 匹配记录
  2. 找到total_count
  3. 跳过记录
  4. 并且还可以根据我们在查询中的需要重塑数据。
松元明
2023-03-14

您可以在单个查询中使用aggregate(),而不是使用两个单独的查询:

聚合“$facet”可以更快地获取总计数和跳过的数据

    db.collection.aggregate([

      //{$sort: {...}}

      //{$match:{...}}

      {$facet:{

        "stage1" : [ {"$group": {_id:null, count:{$sum:1}}} ],

        "stage2" : [ { "$skip": 0}, {"$limit": 2} ]
  
      }},
     
     {$unwind: "$stage1"},
  
      //output projection
     {$project:{
        count: "$stage1.count",
        data: "$stage2"
     }}

 ]);

输出如下:-

[{
     count: 50,
     data: [
        {...},
        {...}
      ]
 }]

还有,看看https://docs.mongodb.com/manual/reference/operator/aggregation/facet/

何兴邦
2023-03-14

我建议您使用两个查询:

>

db。收集查找()。跳过(20)。限制(10)这里我假设您可以使用按某个字段排序,所以不要忘记在该字段上添加索引。这个查询也会很快。

我认为您不应该查询所有项目,而应该执行“跳过”和“执行”,因为以后当您有大数据时,您将在数据传输和处理方面遇到问题。

 类似资料:
  • 根据我的理解,消费者阅读特定主题的消息,并且消费者客户机将定期提交偏移量。 因此,如果由于某种原因,使用者失败了一个特定的消息,该偏移量将不会被提交,然后您可以返回并重新处理该消息。 是否有任何东西跟踪您刚刚消耗的偏移和您随后提交的偏移?

  • 我有一个Kafka的题目有1个分区。如果它有100条消息,偏移量将从0.99开始。 根据Kafka保留策略,在指定的时间之后,所有的消息都将被清除。 并且我正在发送100个新的消息到主题,一旦所有已经被清除(在保留期之后)。现在,消息的新偏移量从哪里开始呢?是从100还是从0?? 我想知道新的偏移是100-199还是0-99?

  • 问题内容: 在我的数据库中,我有一个包含两列的表。第一列包含日期,第二列是计数变量。我想知道是否有可能根据日期和计数来计算每个工作日的平均计数。在下面的一个小例子中: 桌子: 输出: 问题答案: 您可以对表达式进行一系列调用以提取当天的名称: 编辑: 鉴于编辑后的帖子中已更新了预期的输出,因此操作起来容易得多-只需按:分组即可:

  • 在执行手工抵销管理时,我遇到了以下问题:(使用0.9) 为了手动管理偏移量,对于每个消耗的记录,我检索记录的当前偏移量并提交新的偏移量(currentOffset+1,因为偏移量重置策略是“最新的”)。 当创建新的使用者组时,它没有显式的偏移量(偏移量是“未知”的),因此,如果它在停止之前没有使用来自所有现有分区的消息,那么它将只为部分分区(使用者从中获取消息的分区)提交偏移量,而其余分区的偏移量

  • 我正在查找与url匹配但返回自定义对象的记录。 我有这个模型。。 我想查询该模型并匹配url,但返回如下响应: 我需要能够通过将记录的ip与过程中的变量进行比较,动态计算反应的ip是否为真。 一次尝试是 但我似乎无法集中IP并查看我的变量IP是否在该数组中。 谢谢你的帮助。我第一次问!

  • 问题内容: 我试图找出如何用Mongoose做特定的查询。我在mongodb中有这样的东西: 我想获取实际日期和modificationDate之间的差异大于5天的所有对象。 问题答案: 计算5天的截止时间,然后使用运算符和计算出的截止值执行: