【问题标题】:mongodb ObjectId is treated differetlymongodb ObjectId 被区别对待
【发布时间】:2018-07-03 10:41:42
【问题描述】:

我尝试使用$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 的最后一个代码的查询。

谢谢。

【问题讨论】:

    标签: mongodb mongoose aggregate objectid


    【解决方案1】:

    Mongoose 的文档指出,管道阶段的处理方式与本地管道阶段类似,因此:您必须将您的 id 转换为 ObjectIds。

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

    注意:

    • 返回的文档是纯 javascript 对象,而不是 mongoose 文档(因为可以返回任何形状的文档)。
    • Mongoose 不会投射管道阶段。除非 _id 是数据库中的字符串,否则以下内容将不起作用

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

    【讨论】:

    • 哦,谢谢,最后一个问题,除了聚合之外还有什么行为?
    • 我不知道,但我很可能弄错了
    猜你喜欢
    • 2018-02-13
    • 2013-10-06
    • 2017-10-31
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2019-02-05
    • 2019-05-27
    • 1970-01-01
    相关资源
    最近更新 更多