【问题标题】:Select nested array object and replace it选择嵌套数组对象并替换它
【发布时间】:2017-05-30 09:55:09
【问题描述】:

我得到了一个数组(作为 mongoDB 查询的结果),其中包含如下元素:

{ 
    "_id": "ExxTDXJSwvRbLdtpg",
    "content": [
        {
            "content": "First paragraph", 
            "language":"en", 
            "timestamp":1483978498 
        },
        {
            "content": "Erster Abschnitt", 
            "language":"de", 
            "timestamp":1483978498 
        }
    ]
}

但我只需要为每个数据数组元素获取一个内容字段,该字段应由语言选择。所以结果应该是(假设选择英文内容):

{ 
    "_id": "ExxTDXJSwvRbLdtpg",
    "content": "First paragraph"
}

而不是获取所有内容数据...

我尝试用find(c => c.language === 'en) 来做,但我不知道如何将它用于数据数组的所有元素。或许也可以直接通过mongodb查询获取数据??

【问题讨论】:

    标签: javascript arrays mongodb ecmascript-6


    【解决方案1】:

    你可以迭代数组并替换里面的值。

    var array = [{ _id: "ExxTDXJSwvRbLdtpg", content: [{ content: "First paragraph", language: "en", timestamp: 1483978498 }, { content: "Erster Abschnitt", language: "de", timestamp: 1483978498 }] }];
    
    array.forEach(a => a.content = a.content.find(c => c.language === 'en').content);
    
    console.log(array);

    检查content的版本

    var array = [{ _id: "ExxTDXJSwvRbLdtpg", content: [{ content: "First paragraph", language: "en", timestamp: 1483978498 }, { content: "Erster Abschnitt", language: "de", timestamp: 1483978498 }] }, { _id: "no_content" }, { _id: "no_english_translation", content: [{ content: "Premier lot", language: "fr", timestamp: 1483978498 }, { content: "Erster Abschnitt", language: "de", timestamp: 1483978498 }] }];
    
    array.forEach(function (a) {
        var language;
        if (Array.isArray(a.content)) {
            language = a.content.find(c => c.language === 'en');
            if (language) {
                a.content = language.content;
            } else {
                delete a.content;
            }
        }
    });
    
    console.log(array);

    【讨论】:

    • 这是否适用于缺少内容字段的文档?因为不是每个元素都有内容字段。
    • 那会发生什么?
    【解决方案2】:

    鉴于_idlanguage 是输入变量,那么您可以使用此聚合命令来获得预期结果:

    db.collection.aggregate([{
      $match: {
        _id: _id,
      }
    }, {
      $unwind: '$content'
    }, {
      $match: {
        'content.language': language,
      }
    }, {
      $project: {
        _id: 1,
        content: '$content.content'
      }
    }])
    

    【讨论】:

    • 我正在使用流星,我认为聚合不适用于 :-(
    • 哦,我也是 Meteor 开发者 :) 你可以使用这个包在服务器中使用聚合 meteorhacks:aggregate
    【解决方案3】:
    var aobjs = [{
      "_id": "ExxTDXJSwvRbLdtpg",
      "content": [
        {
          "content": "First paragraph",
          "language":"en",
          "timestamp":1483978498
        },
        {
          "content": "Erster Abschnitt",
          "language":"de",
          "timestamp":1483978498
        }
      ]
    }];
    
    var result = aobjs.map(o => ({ id: o._id, content: o.content.find(c => c.language === 'en').content }));
    

    这会为每个对象返回一个只有 id 和内容的对象。在本例中,结果为:

    [ { id: 'ExxTDXJSwvRbLdtpg', content: '第一段' } ]

    【讨论】:

      猜你喜欢
      • 2022-10-23
      • 2021-12-13
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多