【问题标题】:Mongoose: search for ObjectID by ArrayMongoose:按数组搜索 ObjectID
【发布时间】:2022-12-12 07:22:34
【问题描述】:

我想通过聚合多个 ObjectID 之一来过滤我的集合。

由于某些 DocumentDB 限制,我无法构建具有不相关子查询的单个管道。所以我的解决方法是在两个查询中完成。

例如:我有一个返回所有 teamIds 的聚合,在某些情况下作为带有 ID 的对象数组。

[{_id: ObjectID("abcdef")}, {_id: ObjectID("ghijkl")}, {_id: ObjectID("vwxyz")}, ...]

我现在想要使用 ObjectID 对另一个集合进行第二个聚合过滤。

这适用于 Mongo Compass:

{
  "team": {
    "$in": [ObjectId("60aabcb05c7462f42b3d7zyx"), ObjectId("60aabc7b05c7462f42b3dxyz")]
  },
  ....
}

我的问题是我找不到 JS 生成这种管道的正确语法。 无论我尝试什么,JS 总是将我的 ObjectID 数组转换为如下所示:

{
  "team": {
    "$in": [{
      "_id": "60aabcb05c7462f42b3d7zyx"
    },{
      "_id": "60aabc7b05c7462f42b3dxyz"
    }]
  },

【问题讨论】:

    标签: mongodb mongoose aggregation-framework aws-documentdb


    【解决方案1】:

    我这样修好了。我不是 100% 为什么这个语法有效,因为它仍然只是一个对象数组,像以前一样格式化,但我猜猫鼬有一些东西,这对我来说是不透明的。

    let teams = await TeamMgmt.getTeamsAggregatedByFilter( teamFilter )
    
    // make an array of ObjectIds so we can filter for them.
    let idArray = []
    Object.keys( teams ).map( function ( key, index ) {
        idArray.push( new mongoose.Types.ObjectId( teams[ index ]._id.toString() ) )
    } );
    
    const shiftFilter = [
        {
          '$match': {
              'team': {
                  "$in": idArray
              },
              ....
        }
    

    【讨论】:

      猜你喜欢
      • 2011-12-14
      • 1970-01-01
      • 2013-10-09
      • 2016-05-31
      • 2015-05-02
      • 2017-11-22
      • 2021-03-03
      • 2016-06-13
      • 2015-11-10
      相关资源
      最近更新 更多