удалить поле массива в базе данных mongodb

1

Я использую 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"
        }]

Может ли кто-нибудь помочь мне, спасибо заранее

  • 0
    Вы хотите удалить поле в базе данных или только в вашем ответе json из базы данных?
  • 0
    я хочу удалить поле только в ответе JSON, а не в БД
Показать ещё 1 комментарий
Теги:
mongodb-query
sails.js

5 ответов

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;

      })
0

Это работает для меня. Я не знаю, работаете ли вы с объектом JSON, и вам нужно преобразовать его в объект javascript (students.toObject()).

var students = studentsJSON.toObject();

var newStudents = students.map(studentData => {
    if(studentData.subjects.length < 2) {
        delete studentData.subjects;
    }
    return studentData;
});
  • 1
    Вы используете delete для объекта JSON. Но вопрос скорее в удалении из базы данных.
  • 0
    Я не прошу удалить в самой БД, но мне нужно получить вывод JSON без длины массива больше 1
Показать ещё 6 комментариев
0

Я не знаю, чего вы пытаетесь достичь здесь, но заполняет работу на уровне приложений. вы можете напрямую использовать конвейер агрегации для этого, используя $ 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 вы можете использовать "$$ REMOVE" вместо null на этапе addFields, а также после $ lookup вы можете снова использовать $ project для удаления пустого массива

0

попробуйте этот код

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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню