首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongodb聚合查询$skip $limit问题

Mongodb聚合查询$skip $limit问题
EN

Stack Overflow用户
提问于 2019-06-06 15:58:56
回答 1查看 783关注 0票数 0

我从我的应用程序中调用了一个查询,向我提供了我数据库中的分页结果

代码语言:javascript
复制
const query = [
  {
    "$match" : {
      "$or" : [
        { "expires_at" : { "$gt" : moment().toISOString() }},
        { "expires_at" : null }
      ],
      "vendor_category" : {
        "$nin" : ignoredCategories
      }
    }
  },
  {
    "$lookup": {
      "from": models.retailers.collection.name,
      "localField": "retailer",
      "foreignField": "_id",
      "as": "retailer"
    }
  },
  {
    "$lookup": {
      "from": models.categories.collection.name,
      "localField": "category",
      "foreignField": "_id",
      "as": "category"
    }
  },
  {
    "$sort": {
      "category.popularity" : -1,
      ...sortBy
    }
  },
  { "$unwind": "$retailer" },
  { "$unwind": "$category" },
  { "$skip" : skip },
  { "$limit" : limit }
]

这主要是起作用的,我的两个$lookup$unwind对象将其他集合加入到结果中,我的$sort对象根据产品类别的流行程度正确地对根查询进行排序。

但是,我的$match对象只返回大约18 ( 72)个结果。这很好,除非我运行const total = await models.products.countDocuments(query[0].$match)时,所以使用匹配查询来计数文档,我得到了72。所以两者之间是不匹配的。

那么剩下的结果发生了什么呢?我在这个查询中做错什么了吗?这绝对是我编写的第一个聚合查询,所以可能我完全遗漏了什么。欢迎任何提示/问题/优化!如果你需要更多的信息,请告诉我。

这里的编辑是扩展的匹配查询的一个例子。当我使用Model.find时,它运行得很好,但是由于我一直在隔离查询的各个部分,这似乎是罪魁祸首。其目的是只提取过期时间大于当前时间或字段为null的结果。数据来自刮板,有时我没有过期的数据。我也排除了一串类别,这是一个安全的显示项目,使它通过刮刀,但我不想在网站上。

代码语言:javascript
复制
$match : {
       $or : [
         { expires_at : { $gt : moment().toISOString() }},
         { expires_at : null }
      ],
      vendor_category : {
        $nin : [ 'ID-6',   'ID-8', 'ID-283', 'ID-288', 'ID-354', 'ID-513', 'ID-654', 'ID-659', 'ID-33', 'ID-450', 'ID-497',  'ID-59', 'ID-404', 'ID-337']
      }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-07 14:45:24

好的,在挖掘和挖掘之后,我找到了一个github问题,它解决了我的问题,希望这将在将来帮助其他人。当使用Model.aggregate时,猫鼬不会抛出它的参数。

如果您希望与使用Model.aggregate的日期匹配,则必须将日期包装在new Date()中。

最初我做的是不起作用的事情:{ expires_at : { $gte : moment().toISOString() }}

并将其更改为以下内容:{ expires_at : { $gte : new Date(moment().toISOString()) }}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56481243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档