我有一个聚合管道,被困在一个舞台上.此时,我有一个以下格式的文档:
I have an aggregation pipeline and am stuck on a stage. At this point I have a document in the following format:
{ _id:ObjectId(5e3d326637df7e4dda73ec22), levelName:"Level 1", levelNames: { "Level 1":"5e567993b6ed4b7b4d2c044d" "Level 2":"5e567996a7826d45f836dfa3" "Level 3":"5e5679991f515a01c73e9006" } }我想添加一个$ addField/$ set阶段,该阶段为我提供levelNames对象中条目的ID值,并带有与根文档的levelName属性匹配的键.
and I want to add an $addField/$set stage which gives me the ID value of the entry in the levelNames object with a key matching the levelName property of the root document.
我一直在尝试使用某种动态字段路径($ concat:["levelNames.","$ levelName"]),但是没有运气.这是我的$ addField阶段:
I've been trying to use some sort of dynamic field path ($concat: ["levelNames.", "$levelName"]) but have had no luck. This is my $addField stage:
/** * newField: The new field name. * expression: The new field expression. */ { currentLevelId: { $let: { vars: { levelPath: { $concat: ["levelNames.", "$levelName"] } }, in: { currentLevelId: "$$levelPath" } } } }我得到的结果是:
{ _id:ObjectId(5e3d326637df7e4dda73ec22), levelName:"Level 1", levelNames: { "Level 1":"5e567993b6ed4b7b4d2c044d" "Level 2":"5e567996a7826d45f836dfa3" "Level 3":"5e5679991f515a01c73e9006" } currentLevelId: { currentLevelId:"levelNames.Level 1" } }我正在尝试将currentLevelId的结果设置为"5e567993b6ed4b7b4d2c044d",所以我想要的输出是:
I'm trying to get the result of currentLevelId to be "5e567993b6ed4b7b4d2c044d", so my desired output is:
{ _id:ObjectId(5e3d326637df7e4dda73ec22), levelName:"Level 1", levelNames: { "Level 1":"5e567993b6ed4b7b4d2c044d" "Level 2":"5e567996a7826d45f836dfa3" "Level 3":"5e5679991f515a01c73e9006" }, currentLevelId: "5e567993b6ed4b7b4d2c044d" }有没有办法做到这一点?
Is there a way this can be achieved?
推荐答案使用此选项:
db.collection.aggregate([ { $set: { data: { $objectToArray: "$levelNames" } } }, { $set: { currentLevelId: { $arrayElemAt: ["$data.v", { $indexOfArray: ["$data.k", "$levelName"] }] } } }, { $unset: "data" } ])蒙戈游乐场
更多推荐
MongoDB聚合:通过动态字段路径从嵌入式文档添加字段
发布评论