Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 是否可以对聚合管道中的每个文档应用不同的聚合投影?_Mongodb_Mongoose_Aggregation Framework - Fatal编程技术网

Mongodb 是否可以对聚合管道中的每个文档应用不同的聚合投影?

Mongodb 是否可以对聚合管道中的每个文档应用不同的聚合投影?,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,以这个集合为例: [ { id: 1, nest: [ object: { date: '2020-04-19T00:00:00.000Z' }, object: { date: '2020-04-20T00:00:00.000Z' }, object: { date: '2020-04-21T00:00:00.000Z' } ] }, {

以这个集合为例:

[
  {
    id: 1,
    nest: [
      object: {
        date: '2020-04-19T00:00:00.000Z'
      },
      object: {
        date: '2020-04-20T00:00:00.000Z'
      },
      object: {
        date: '2020-04-21T00:00:00.000Z'
      }
    ]
  },
  {
    id: 2,
    nest: [
      object: {
        date: '2020-04-22T00:00:00.000Z'
      },
      object: {
        date: '2020-04-23T00:00:00.000Z'
      },
      object: {
        date: '2020-04-24T00:00:00.000Z'
      },
      object: {
        date: '2020-04-25T00:00:00.000Z'
      }
    ]
  }
]
我想生成一个聚合,该聚合的形状与原始集合相同,但根据特定文档限制
nest
对象的数量。例如,对于集合的第一个成员,我希望对象的日期小于或等于
“2020-04-20T00:00:00.000Z”
,对于第二个成员,我希望对象的日期小于或等于
“2020-04-24T00:00:00.000Z”
。这就是我想要的结果:

[
  {
    id: 1,
    nest: [
      object: {
        date: '2020-04-19T00:00:00.000Z'
      },
      object: {
        date: '2020-04-20T00:00:00.000Z'
      }
    ]
  },
  {
    id: 2,
    nest: [
      object: {
        date: '2020-04-22T00:00:00.000Z'
      },
      object: {
        date: '2020-04-23T00:00:00.000Z'
      },
      object: {
        date: '2020-04-24T00:00:00.000Z'
      }
    ]
  }
]
我得到的最远结果是将静态日期应用于集合的所有成员,如下所示:

{
  $project: {
    nest: {
      $filter: {
        input: "$nest",
        as: "nested",
        cond: { $lte: [ "$$nested.date", <date-goes-here> ] }
      }
    }
  }
}
{
$项目:{
嵌套:{
$filter:{
输入:“$nest”,
如:“嵌套”,
条件:{$lte:[“$$nested.date”,]}
}
}
}
}
这将适用于我使用的所有收集成员的日期,这不是我想要的

我怎样才能达到我想要的输出?谢谢

更新


这适用于为1:1或组聊天返回聊天的端点。集合中的每个成员都是聊天室,
nest
对象是特定聊天室中的消息数组。我想对客户端请求组聊天时返回的消息数进行分页,因此我的想法是只获取客户端指定日期之前的消息。客户端可以发送一个请求,说明对于聊天室1(这是一个群聊),它希望在
“2020-04-20T00:00:00.000Z”
或之前发送消息,对于聊天室2(也是一个群聊),它希望在
“2020-04-24T00:00:00.000Z”
或之前发送消息。我用以获取客户端请求的聊天,我想用以过滤掉客户端为该聊天指定的日期之后的消息。

是的,这是可能的,但要做到这一点,您必须根据用户输入创建一个JSON对象,基本上是键值对,如

datesHash = { chatId:date,chatId2:date2} // these id's and dates will be based on user input as you mentioned above.
然后在上面的聚合中巧妙地使用它,比如

{
  $project: {
    nest: {
      $filter: {
        input: "$nest",
        as: "nested",
        cond: { $lte: [ "$$nested.date", datesHash["$_id"] ] }
      }
    }
  }
}

我已经尝试在工作示例上重新创建您的解决方案(这只是供参考而不是确切的解决方案)

是的,这是可能的,但要做到这一点,您必须基于用户输入创建一个JSON对象,基本上是键值对,如

datesHash = { chatId:date,chatId2:date2} // these id's and dates will be based on user input as you mentioned above.
然后在上面的聚合中巧妙地使用它,比如

{
  $project: {
    nest: {
      $filter: {
        input: "$nest",
        as: "nested",
        cond: { $lte: [ "$$nested.date", datesHash["$_id"] ] }
      }
    }
  }
}

我已尝试在工作样本上重新创建您的解决方案(这只是供参考,不是确切的解决方案)

如果您收集了更多文档,如何?应该从3个及以上应用什么条件?这取决于集合中的每个成员。我试图简化场景,但基本上对于具有某些属性的文档,我应用了此过滤器,而对于其他文档,我没有。我是用
$cond
完成的。但问题是,对于每个需要过滤器的文档,它都需要自己的唯一日期。条件的日期是否存在于文档中,或者是否可以从文档中的某些内容派生出来?您可能需要包括如何计算日期的逻辑。@TheeSritabtim我已经添加了一些详细信息,如果您还需要,请告诉我。谢谢在
$filter
cond
中,您可以将条件指定为:
(id=1和nested.date lte“2020-04-20”)或(id=2和nested.date lte“2020-04-24”)
。如果您还有更多文档在收集中呢?应该从3个及以上应用什么条件?这取决于集合中的每个成员。我试图简化场景,但基本上对于具有某些属性的文档,我应用了此过滤器,而对于其他文档,我没有。我是用
$cond
完成的。但问题是,对于每个需要过滤器的文档,它都需要自己的唯一日期。条件的日期是否存在于文档中,或者是否可以从文档中的某些内容派生出来?您可能需要包括如何计算日期的逻辑。@TheeSritabtim我已经添加了一些详细信息,如果您还需要,请告诉我。谢谢在
$filter
条件中,您可以将条件指定为:
(id=1和nested.date lte“2020-04-20”)或(id=2和nested.date lte“2020-04-24”)
。感谢您的回答。我一直没能让它工作。如果您使用
datesHash[“$\u id”]
而不是
datesHash[“$id”]
,您能确认它是否适用于您吗
\u id
是对象id,这是我实际使用的,但到目前为止它不起作用(我得到的是一个空结果,因为没有任何东西被投影)。哦,那是打字错误,我会编辑它,是的,如果你使用$\u id,它应该工作得很好,因为我在多个项目中尝试了这种方法谢谢这个答案。我一直没能让它工作。如果您使用
datesHash[“$\u id”]
而不是
datesHash[“$id”]
,您能确认它是否适用于您吗
\u id
是对象id,这是我实际使用的,但到目前为止它不起作用(我得到的是一个空结果,因为没有任何东西被投影)。哦,这是打字错误,我会编辑它,是的,如果你使用$\u id,它应该工作得很好,因为我在多个项目中尝试过这种方法