You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongoose聚合方法中使用ID数组匹配文档无结果的问题求助

Mongoose聚合方法中使用ID数组匹配文档无结果的问题求助

嘿,我来帮你搞定这个问题!你遇到的核心原因其实很简单:Mongoose的find方法会自动把字符串格式的ID转换成ObjectId类型,但聚合(aggregate)管道不会做这个自动转换,所以你的$in条件里的字符串ID和文档中存储的ObjectId类型不匹配,自然查不到任何结果啦。

解决方案:手动转换ID类型

你只需要把isSelectedTrips数组里的每个字符串ID,手动转换成mongoose.Types.ObjectId类型就行,具体代码如下:

const mongoose = require('mongoose');
// 先把字符串ID数组转成ObjectId数组
let isSelectedTrips = ["******", "*****"].map(id => mongoose.Types.ObjectId(id));

const me = await Trips.aggregate([
  {
    $match: { isPublished: true, _id: { $in: isSelectedTrips } },
  },
  {
    $facet: {
      getTrips: [{ $skip: skip }, { $limit: Number(searchlimit) }],
      totalDocumentSize: [{ $count: "count" }],
    },
  },
]);
trips = me[0].getTrips;
totalDocumentSize = me[0].totalDocumentSize[0]?.count || 0;

为什么这样能解决问题?

MongoDB里的_id字段存储的是ObjectId对象,而不是字符串。find方法内部做了类型兼容处理,会自动把你传入的字符串ID转换成ObjectId去匹配;但聚合管道是直接和MongoDB原生交互的,不会经过Mongoose的自动类型转换逻辑,所以必须手动把字符串转成对应的ObjectId类型,才能让$in条件正确匹配到目标文档。

你可以先打印转换后的isSelectedTrips,确认每个元素都是ObjectId类型,再执行聚合查询,应该就能得到预期的结果了~

备注:内容来源于stack exchange,提问作者superkingz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 10:49:35