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

MongoDB聚合:按ObjectId将_id作为字符串的数组筛选

华建同
2023-03-14

我有以下收藏:

const movieSchema = new Schema({
  title: String
  ...
})

const userSchema = new Schema({
  firstName: String,
  lastName: String,
  movies: [
    movie: {
      type: Schema.Types.ObjectId,
      ref: 'Movie'
    },
    status: String,
    feeling: String
  ]
  ...
})

我试图将电影(及其所有细节)与用户状态和对该电影的感觉相匹配,并使用聚合:

Movie.aggregate([
  { $match: { _id: ObjectId(movieId) } },
  {
    $lookup: {
      from: 'users',
      as: 'user_status',
      pipeline: [
        { $match: { _id: ObjectId(userId) } },
        {
          $project: {
            _id: 0,
            movies: 1
          }
        },
        { $unwind: '$movies' }
      ]
    }
  },
  
])

其中返回:

[
  {
    _id: 610b678702500b0646925542,
    title: 'The Shawshank Redemption',
    user_status: [
      {
        "movies": {
          "_id": "610b678702500b0646925542",
          "status": "watched",
          "feeling": "love"
        }
      },
      {
        "movies": {
          "_id": "610b678502500b0646923627",
          "status": "watched",
          "feeling": "like"
        }
      },
      {
        "movies": {
          "_id": "610b678502500b0646923637",
          "status": "watched",
          "feeling": "like"
        }
      },
    ]
  }
]

我希望的结果是匹配user_status中的第一部电影,以获得最终结果:

[
  {
    _id: 610b678702500b0646925542,
    title: 'The Shawshank Redemption',
    status: "watched",
    feeling: "love"
  }
]

我想我的下一步是:

{
  $addFields: {
    user_status: {
      $filter: {
        input: '$user_status',
        cond: {
          $eq: ['$$this.movies._id', '$_id']
        }
      }
    }
  }
}

但是它不起作用——不确定这个$addFields是否正确,我知道的一个问题是,我的第一个_id是一个ObjectId,第二个似乎是一个字符串。

共有1个答案

陈德泽
2023-03-14

如果我理解正确,你可以在已经存在的$look kup管道中$Filter用户,这会让后面的事情变得更简单:

db.movies.aggregate([
  {$match: {_id: ObjectId(movieId)}},
  {
    $lookup: {
      from: "users",
      as: "user_status",
      pipeline: [
        {$match: {_id: ObjectId(userId)}},
        {$project: {
            movies: {
              $first: {
                $filter: {
                  input: "$movies",
                  cond: {$eq: ["$$this.movie", ObjectId(movieId)]}
                }
              }
            }
          }
        }
      ]
    }
  },
  {
    $project: {
      title: 1,
      feeling: {$first: "$user_status.movies.feeling"},
      status: {$first: "$user_status.movies.status"}
    }
  }
])

看看它是如何在操场上工作的例子

 类似资料:
  • --------编辑-------------------------------------------- 我在我的服务器行为中发现了一些非常奇怪的东西。当我执行一个简单的findById调用时,我的image项是一个Objectid数组。但是当使用聚合时,ObjecIds变成了String。有人知道上面是什么吗?

  • 我在mongodb 4.0中使用Spring(boot)数据2.2.7。我已经设置了3个集合,试图通过聚合查找操作加入这些集合。 目录 股票 操作 目录 映射由 股票 映射由 productId字段引用目录集合中的_id字段 操作 映射由 组件ID字段指的是库存集合中的_id 我想查询操作或库存收集,以检索相应的节点或组件对象列表,该列表由Product.model字段(在目录集合中)排序。) 虽

  • 我有一个对象,它的父类可以设置_id字段,也可以不设置。 在这种情况下,没有设置_id字段,我将一个对象传递给 收集insertOne(对象) 通常情况下,mongo会为未指定的_id生成一个ObjectId(),但由于某种原因,每当_id由父类指定且未设置时,它会生成一个id,bug会将id保存为数据库中的字符串,而不是ObjectId。 我所经历的 {“name”:“name”} 预期: {“

  • 如何编写Elasticsearch术语聚合,将存储桶按整个术语而不是单个标记拆分?例如,我想按州进行聚合,但以下返回的是纽约、纽约、泽西和加利福尼亚作为单个桶,而不是纽约、新泽西和加利福尼亚作为预期的桶: 我的用例就像这里描述的那样https://www.elastic.co/guide/en/elasticsearch/guide/current/aggregations-and-analysi

  • 我将按照https://Quarkus.io/guides/rest-data-panache和https://Quarkus.io/guides/MongoDB-panache教程使用Quarkus Panache MongoDB实现一个简单的MongoDB实体和资源。 以下是我目前掌握的情况: 运行时,我可以通过调用

  • 我需要返回带有mongoDB聚合的字符串数组。我做了以下操作: 它返回: 有没有一种方法可以返回像这样的字符串数组: 非常感谢任何花时间帮助我的人。。 编辑 添加数据: