【问题标题】:MongoDB aggregation project string to ObjectIdMongoDB 聚合项目字符串到 ObjectId
【发布时间】:2015-02-18 15:56:08
【问题描述】:

我正在尝试在聚合查询中将十六进制字符串转换为其等效的 ObjectID。我尝试了两种不同的方法:

db.omvas.aggregate([
    {$project:{
        EID:{$let: {
               vars: {
                  id:  "$EID"
               },
               in: ObjectId("$$id")
            }},
        }
    },
    {$group:{
        _id:"$EID"
        }
    }
]);

db.omvas.aggregate([
    {$project:{
        EID: ObjectId("$EID")
        }
    },
    {$group:{
        _id:"$EID"
        }
    }
]);

无论使用哪种方法,我都会不断收到错误“错误:无效的对象 id:长度”。我测试了添加一个文字字符串来代替聚合变量,我得到了一个带有正确 ObjectID 的结果。似乎字符串值没有传递给 Mongo 的 ObjectId 函数,而是变量名作为文字字符串传递。

任何人都知道我想要完成的事情是否可行?有什么我缺少的魔法吗?

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    ObjectId 是 shell 中 ObjectIds 的构造函数。当你写类似的东西时

    "EID" : { "$let" : {
               "vars" : { "id" :  "$EID" },
               "in" : ObjectId("$$id")
            } }
    

    mongo shell 在发送聚合请求之前评估ObjectId("$$id")。就像你在 Javascript 中调用函数一样

    var x = 2
    var y = 4
    f(x + y) // f(6)
    

    您需要一个聚合运算符来将字符串转换为 ObjectId。不幸的是,从 MongoDB 2.6 开始,不存在这样的函数。为什么需要转换字符串?你打算用它做什么?也许有一种方法可以解决聚合中缺少转换运算符的问题。

    【讨论】:

    • 谢谢,这很有意义。此特定查询只是报告工作流程中的一个阶段。 ObjectId 是必要的,因为它被管道下游的查询使用。我正在重新考虑它们现在的工作方式,并认为我有更好的方法来执行它们。
    • 就我而言,我想做一个$lookup,其中本地字段是ObjectId 的字符串表示,而外部字段是实际的ObjectId。知道这是否可以使用 MongoDB 3.2?
    • 一种解决方法是编写一个脚本,将包含 id 作为 ObjectId 的新字段添加到集合中的文档中。然后使用新字段进行 $lookup。
    • 可以用js把字符串转成objectID吗?我的聚合管道是动态的,需要在管道中将 ID 作为参数传递,所以在将该字符串转换为 objectId 后,我必须将其作为函数参数传递。
    【解决方案2】:

    您可以在 mongo 4.0 版中使用简写 $toObjectId

    类似

    db.omvas.aggregate([
       {"$project":{"EID":{"$toObjectId":"$EID"}}
    ])
    

    【讨论】:

    • 如果 EID 包含一些无效的 objectid 怎么办
    猜你喜欢
    • 2020-07-15
    • 2016-07-03
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2020-09-19
    • 1970-01-01
    相关资源
    最近更新 更多