【问题标题】:delete array field in a mongodb database删除 mongodb 数据库中的数组字段
【发布时间】:2017-12-13 07:15:48
【问题描述】:

我正在使用 mongoDB,我的 JSON(表名是“student”)看起来像

           [{
             name : "John",
             subjects:["English", "Maths"]
            },
            {
             name : "Winsel",
             subjects : ["Maths"]
            }]

这里的“科目”是其他一些表并与学生相关联,我可以使用查找查询来获取数据,

student.find({}).populate('subjects').then(function(studentData){console.log(studentData)})

通过使用这个查询,我可以得到数据

           [{
             name : "John",
             subjects:["English", "Maths"]
            },
            {
             name : "Winsel",
             subjects : ["Maths"]
            }]

之后我需要删除长度小于2的字段“主题”,我正在使用

             if(studentData.subjects.length < 2){
                 delete studentData.subjects
             }

但它不会删除该字段,当我不使用 if 条件时它会显示相同的结果。 我预期的 JSON 是

      [{
         name : "John",
         subjects:["English", "Maths"]
        },
        {
         name : "Winsel"
        }]

谁能指导我,提前谢谢

【问题讨论】:

  • 您想删除数据库中的字段还是只删除数据库中的 json 响应?
  • 我只想删除 JSON 响应中的字段,而不是数据库中的字段
  • 你可以看到我对问题的回答

标签: javascript node.js mongodb mongodb-query sails.js


【解决方案1】:

试试这个

var studentsList = [{
                      name : "John",
                      subjects:["English", "Maths"]
                    },
                    {
                      name : "Winsel",
                      subjects : ["Maths"]
                   }];

var newStudentList = _.map(studentsList , function(eachStudentData){
                          if(eachStudentData.subjects <2){
                              return _.pick(eachStudentData, 'name');
                          } else {
                              return eachStudentData;
                          }
                     });

您可以将新形成的学生列表 newStudentList 用于您的代码

【讨论】:

    【解决方案2】:

    要删除 json 响应中的字段,您可以在查询函数的回调函数中使用 delete

    student.find({}).populate('subjects').then(function(studentData){
          var newData = studentData;
    
          newData.map(item => {
            if(item.subjects.length < 2) {
                delete item.subjects;
            }
            return item;
          })
          // you can use the newData here;
    
          })
    

    【讨论】:

      【解决方案3】:

      这对我有用。我不知道您是否正在使用 JSON 对象并且需要将其转换为 javascript 对象 (students.toObject())。

      var students = studentsJSON.toObject();
      
      var newStudents = students.map(studentData => {
          if(studentData.subjects.length < 2) {
              delete studentData.subjects;
          }
          return studentData;
      });
      

      【讨论】:

      • 您在 JSON 对象上使用 delete。但问题更多是关于从数据库中删除。
      • 我不是要求在数据库本身中删除,但我需要在数组长度不大于 1 的情况下获取 JSON 输出
      • 尝试对你的学生 JSON 元素做 .toObject,我编辑了示例
      • 使用此命令删除 studentData.subjects,它什么也不做,当使用此命令删除 studentData.subjects[0] 时,输出为 [{ name : "John",subjects:["英语", "数学"] },{name : "Winsel", 科目 : []}]
      • 我不知道你在做什么不同,它对我有用。
      【解决方案4】:

      试试这个代码

      var data = [{
          name: "John",
          subjects: ["English", "Maths"]
        },
        {
          name: "Winsel",
          subjects: ["Maths"]
        }
      ];
      console.log(data);
      for (var i = 0; i < data.length; i++) {
        if (data[i].subjects.length < 2) {
          delete data[i].subjects;
        }
      }
      console.log(data);

      【讨论】:

        【解决方案5】:

        我不知道你想在这里实现什么,但填充在应用程序级别上工作。您可以使用 $project(或类似的 $addFields) 和 $lookup 直接使用聚合管道

        db.students.aggregate(
        
            [
                {
                    $addFields: {
                       subjects:{
                         $cond:[{$gte:[{$size:"$subjects"},2]},"$subjects",null]
                       }
                    }
                },
                {
                    $lookup: {
                        "from" : "subjects",
                        "localField" : "subjects",
                        "foreignField" : "name",
                        "as" : "subjects"
                    }
                },
        
            ]
        );
        

        从 mongodb 3.6 开始,您可以在 addFields 阶段使用 "$$REMOVE" 而不是 null 并且在 $lookup 之后你可以再次使用 $project 来删除空数组

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-07
          • 1970-01-01
          • 2012-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多