【问题标题】:Query with $In operator and limit on amount of data loaded使用 $In 运算符查询并限制加载的数据量
【发布时间】:2021-01-28 20:46:58
【问题描述】:

我正在运行以下查询

const query = { 
 $and: [
   { 
     $or: [ 
       {
         status: ‘PROCESSED’
       }, 

       {
         status: ‘IN_PROGRESS’
       }, 
     ],
   },  
   {
      content_id: { $in: contentIds }, 
   }, 
], 
};

为了获取content_id 在给定列表中的所有数据。我想获取每个content_id 的 5 个最新数据项。

我知道我可以通过对每个内容 ID 运行单独的查询、按 content_date DESC 排序并将限制设置为 5 来实现这一点 - 我想在一个查询中实现所有这些,而不是单独运行每个内容ID都有一个,这可能吗?

【问题讨论】:

    标签: mongodb sorting mongodb-query nosql


    【解决方案1】:
    db.coll.aggregate([
         //match query
         {$group:{_id:"$content_id",items:{$push:"$$ROOT"}}}, 
         {$addFields:{items:{$slice:["$items", 5]}}}])
    ])
    
    1. $match 检查内容 ID 是否在给定列表中
    2. 然后$group在每个内容id上,将整个文档添加到items列表中
    3. 然后slice 包含所需元素的数组

    我建议您在project 之前添加一个sort 阶段,以确保多次点击的一致性。

    【讨论】:

    • 澄清一下 - 我的问题中的查询写为{$match:{$and:..}},后跟{$sort: {‘created_date’: -1}},然后是上面的组和项目查询?
    • @Alk 它应该可以工作。显示您的管道(带有匹配阶段)和您希望在结果中出现的示例文档
    • @Alk 这将帮助你答案几乎就在那里playground
    • 感谢 vishal 和 Alex 及时澄清事情。
    • @turivishal 在我用 addFields 替换 project 后有效 - 我接受了,但用这个更改更新答案也许很好
    猜你喜欢
    • 2018-01-31
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2016-04-09
    • 2020-01-02
    相关资源
    最近更新 更多