我尝试使用$in
并传递一个 Id 数组来查询文档。
在这个测试中,我得到了预期的值。
Document.find({
documentId: {
$in: ['598eb5a9957d7427f41d7f08',
'5a5d863cf9d4d74f2b3d3180'
]
}
}).then(data => {
console.log(data);
});
但是当使用它时,我只是得到一个空的结果。
Document.aggregate([{
$match: {
documentId: {
$in: ['598eb5a9957d7427f41d7f08',
'5a5d863cf9d4d74f2b3d3180'
]
}
}
}]).then(data => {
console.log(data);
});
如果我将 id 显式转换为 ObjectId,我可以修复它。
Document.aggregate([{
$match: {
documentId: {
$in: [
new mongoose.Types.ObjectId(
'598eb5a9957d7427f41d7f08'
),
new mongoose.Types.ObjectId(
'5a5d863cf9d4d74f2b3d3180'
)
]
}
}
}]).then(data => {
console.log(data);
});
有什么建议为什么会这样吗?
我想省略转换对象 ID 的最后一个代码上的查询。
谢谢。
Mongoose 的文档指出,流水线阶段的处理方式与原生流水线阶段类似,因此:你必须将你的 id 转换为ObjectId
s。
http://mongoosejs.com/docs/api.html#Aggregate
注意:
- 返回的文档是纯 JavaScript 对象,而不是猫鼬文档(因为可以返回任何形状的文档)。
猫鼬不施放管道阶段。除非_id是数据库中的字符串,否则以下内容将不起作用
new Aggregate([{ $match: { _id: '00000000000000000000000a' } }]); // Do this instead to cast to an ObjectId new Aggregate([{ $match: { _id: mongoose.Types.ObjectId('00000000000000000000000a') } }]);