Я использую 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"
}]
Может ли кто-нибудь помочь мне, спасибо заранее
Попробуй это
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 для своего кода
Чтобы удалить поля в вашем ответе 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;
})
Это работает для меня. Я не знаю, работаете ли вы с объектом JSON, и вам нужно преобразовать его в объект javascript (students.toObject()).
var students = studentsJSON.toObject();
var newStudents = students.map(studentData => {
if(studentData.subjects.length < 2) {
delete studentData.subjects;
}
return studentData;
});
delete
для объекта JSON. Но вопрос скорее в удалении из базы данных.
Я не знаю, чего вы пытаетесь достичь здесь, но заполняет работу на уровне приложений. вы можете напрямую использовать конвейер агрегации для этого, используя $ 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 для удаления пустого массива
попробуйте этот код
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);