【问题标题】:MongoDB replace value during aggregationMongoDB 在聚合期间替换值
【发布时间】:2017-02-27 03:27:41
【问题描述】:

假设这个文件:

{
    _id : Object(“12918”),
    username : “username”,
    password : “password”,
    occupation: {
        name : “Football”,
        code : 254,
    }
},
{
    _id : Object(“12919”),
    username : “username2”,
    password : “password2”,
    occupation: {
        name : “Basketball”,
        code : 255,
    }
}

我想要一个返回的查询:

{
    _id : Object(“12918”),
    occupation : {
        name : “*”,
        code : 254
    }
},
{
    _id : Object(“12919”),
    occupation : {
        name : “*”,
        code : 255
    }
}

所以,一个只返回字段 _idoccupation 的查询。并且字段 occupation.name 必须在所有记录中替换为 *。

我试过这个查询:

aggregate([
    {
        "$project" : 
        { 
            "_id" : 1, 
            “occupation" : 1,
            “occupation.name" : { $literal:“*” } 
        } 
    }
])

返回以下异常:

{ “好”:0, "errmsg" : "不能为字段占用添加表达式,因为已经有该字段或其子字段之一的表达式。", “代码”:16400 }

有没有办法做到这一点?

【问题讨论】:

  • 你的 mongo 服务器版本是多少?
  • 版本为 3.0.1

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

您可以像这样指定occupation 的嵌套文档投影:

db.test.aggregate([{
    "$project": {
        "_id": 1,
        "occupation": {
            code: 1,
            name: { $literal: "*" }
        }
    }
}])

【讨论】:

  • 谢谢伯特兰!
  • 但是如何使用 0 或 1 值替换为其他值,因为当使用 0 或 1 值用于隐藏和显示键时,但如何使用 0 或 1 值替换以前的值
【解决方案2】:

你可以这样做:

db.collectionName.aggregate([{$project:{
           _id:1,
           occupation:{"name":{$literal:"*"},
                       "code":"$occupation.code"
                      } 
           }    
   }])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 2016-02-08
    • 2013-10-23
    • 2015-03-25
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多