MongoDB聚合项目字符串到ObjectId

Ste*_*ren 12 mongodb aggregation-framework

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

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

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

我继续使用任一方法获得错误"错误:无效对象id:长度".我测试了添加一个文字字符串来代替聚合变量,我得到一个带有正确ObjectID的结果.似乎字符串值没有传递给Mongo的ObjectId函数,而是将变量名称作为文字字符串传递.

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

use*_*814 6

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

就像是

db.omvas.aggregate([
   {"$project":{"EID":{"$toObjectId":"$EID"}}
])
Run Code Online (Sandbox Code Playgroud)


wdb*_*ley 5

ObjectId是shell中ObjectIds的构造函数.当你写的东西像

"EID" : { "$let" : {
           "vars" : { "id" :  "$EID" },
           "in" : ObjectId("$$id")
        } }
Run Code Online (Sandbox Code Playgroud)

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

var x = 2
var y = 4
f(x + y) // f(6)
Run Code Online (Sandbox Code Playgroud)

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

  • 在我的例子中,我想做一个`$ lookup`,其中local字段是`ObjectId`的String表示,而外部字段是实际的`ObjectId`.有没有想过这是否可能与MongoDB 3.2? (2认同)