mongodb ObjectId 被区别对待

mongodb ObjectId is treated differetly

我尝试使用 $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);
});

为什么会发生这种情况有什么建议吗?

我想省略关于转换 objectId 的最后一段代码的查询。

谢谢。

Mongoose 的文档声明管道阶段的处理方式与本机管道阶段一样,因此:您必须将您的 ID 转换为 ObjectIds。

http://mongoosejs.com/docs/api.html#Aggregate

Note:

  • The documents returned are plain javascript objects, not mongoose documents (since any shape of document can be returned).
  • Mongoose does not cast pipeline stages. The below will not work unless _id is a string in the database

    new Aggregate([{ $match: { _id: '00000000000000000000000a' } }]);
    // Do this instead to cast to an ObjectId
    new Aggregate([{ $match: { _id: mongoose.Types.ObjectId('00000000000000000000000a') } }]);