【问题标题】:How to create a custom object as output with field name as key in MongoDB?如何在 MongoDB 中以字段名作为键创建自定义对象作为输出?
【发布时间】:2019-08-26 00:06:35
【问题描述】:

更改聚合查询的输出,其中键是数据库中的字段名称。

我尝试了以下方法: How to use field value as key name in Mongodb result

但是会导致如下错误:

MongoError: $arrayToObject 需要 'k' 和 'v' 的对象键。发现不正确的键数:1

var data = await Message.aggregate([
    {
      $group: {
        _id: '$message',
        last_message: { $last: '$date_create', },
        conversation: {
          $push: '$$ROOT',
        },
      },
    },
    {
      $project: {
        input: { $arrayElemAt: ['$conversation.message', 0] },
        output: { $arrayElemAt: ['$conversation.mainTopic', 0] },
        _id: 0,
      },
    },
    { $sort: { last_message: -1 } },
  ]);

我想改变(当前结果)的输出:

{ “输入”:“测试”, “输出”:“一般” },

到:

{ “输入”:“测试”, “输出”:{一般:1,}, },

【问题讨论】:

    标签: javascript node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    要将{ "input": "Test", "output": "general" } 转换为{ "input": "Test", "output": { general: 1 } },您需要$arrayToObject 运算符,该运算符采用具有kv 字段的对象数组或2 元素数组的数组,如下所示:

    db.collection.aggregate([
        {
            $project: {
                _id: 0,
                input: 1,
                output: {
                    $arrayToObject: [
                        [
                            [ "$output", 1 ]
                        ]
                    ]
                }
            }
        }
    ])
    

    MongoDB playground

    【讨论】:

    • 我已经试过这个(见我的帖子)我得到的错误是:MongoError:$arrayToObject 需要一个对象键'k'和'v'。发现不正确的键数:1 现在: MongoError: $arrayToObject 需要一个键值对数组,其中键必须是字符串类型。找到的密钥类型:null
    • 没有 $ 我得到所需的输出但没有字段值,因为它会导致错误。似乎无法在 arrayToObject 中使用 $。你的 MongoDB 游乐场也没有结果?
    • 所以我想$output 出于某种原因计算为null。您的数据中缺少一些部分,或者您的路径定义不正确。您能否修改您的答案并粘贴您想要转换的内容?或者,如果您有多个文档,其中一些包含 null 值,您可以使用 docs.mongodb.com/manual/reference/operator/aggregation/ifNull 指定默认值
    • @cxzzy 您需要美元符号来引用现有字段,否则它只是一个字符串,并且在 $arrayToObject 中是允许的,正如您在 Mongo 游乐场示例中看到的那样
    • 啊,就是这样!伟大的!谢谢。我确实有一些空值,设置一个默认值解决了这个问题。
    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 2011-10-23
    • 2011-11-19
    相关资源
    最近更新 更多