mongodb - 使用键值对将 mongo 数组转换为对象

我有一个包含字符串数组的 mongo 文档,我需要将这个特定的字符串数组转换为包含键值对的对象数组。以下是我目前的方法。

{
    "_id" : ObjectId("57e3720836e36f63695a2ef2"),
    "platform" : "A1",
    "available" : {
        "Community" : {
            "attributes" : {
                "type" : {
                    "values" : [
                        "well-known",
                        "simple",
                        "complex"
                    ],
                    "defaultValue" : "well-known"
                },
[......]


}

当前查询:

templateAttributes.find({platform:"V1"}).map(function(c){
  //instantiate a new array
  var optionsArray = [];
for (var i=0;i< c['available']['Community']['attributes']['type']['values'].length; i++){
    optionsArray[i] = {};              // creates a new object
    optionsArray[i].label = c['available']['Community']['attributes']['type']['values'][i];
    optionsArray[i].value = c['available']['Community']['attributes']['type']['values'][i];
    }
    return optionsArray;
})[0];

结果:

[{label:"well-known", value:"well-known"},
{label:"simple", value:"simple"},
{label:"complex", value:"complex"}]

我的方法是否足够有效,或者有没有办法优化上述查询以获得相同的预期结果?

最佳答案

不太确定你想对最终结果做什么,因为键和值是一样的。尽管如此,您可以使用聚合框架 您可以使用 $unwind 对嵌入的值数组进行非规范化处理。 运算符将其展平,即它为每个数组条目生成每个文档的副本。

展平值数组后,您可以应用 $group 值上的累积运算符来聚合它们。 $project 的最终管道 运算符会将先前分组中的字段整形为所需的格式。

按照此示例了解概念:

templateAttributes.aggregate([
    { "$match": { "platform": "V1" } },
    { "$unwind": "$available.Community.attributes.type.values" },
    {
        "$group": {
            "_id": "$available.Community.attributes.type.values",
            "value": { "$first": "$available.Community.attributes.type.values" }
        }
    },
    {
        "$project": {
            "_id": 0,
            "label": "$_id",
            "value": 1
        }
    }
])

由于你使用的是 Meteor,所以添加 meteor meteorhacks:aggregate 将为 Meteor 添加适当的聚合支持,以便您可以在您的集合上运行上述聚合管道。

https://stackoverflow.com/questions/39653872/

相关文章:

node.js - Nodejs 我需要使用 Passport

mongodb - Meteor 1.4.1.1 上副本集的正确 MONGO_URL 设置是什么

node.js - Node/Express - 保护客户端/服务器之间通信的好方法

ruby-on-rails - 在 Rails 控制台中列出所有 Mongoid 模型

node.js - 我可以在 MongoDB 的聚合查询中申请 forEach 吗?

json - 如何使用 Pentaho 从 json 中的三个表到 mongodb 执行复杂文档

node.js - Mongoose 在未指定的时间段后停止响应

node.js - 如何使用 MongoDB 按名字和姓氏搜索用户?

mongodb - 使用 mongoose 正则表达式与文本在 mongodb 中搜索

node.js - 我的 Electron 应用程序启动时如何启动 mongodb 服务