Я застрял в этом вопросе с трех дней. Мне нужно обновить вложенные объекты в массиве. Чтобы сделать его более сложным, мой Array сам вложен в объект, где ключ должен создаваться динамически, когда пользователь добавляет больше категорий. Я застрял с двумя проблемами:
- Как динамически создавать категории в запросах? (Передача значения по ссылке вызывает синтаксическую ошибку)
- Как обновить спецификацию c Элемент массива на основе некоторых фильтров
Мой документ в Mongodb, который необходимо обновить. Ключи объекта inte rnet и электричество должны создаваться динамически
Для проблемы AI прибегли к жесткому коду категории и перешли на
switch (category) {
case 'internet':
qry = User.findOneAndUpdate({username: obj.username}, {$push: {"data.internet": newBill}});
break;
case 'electricity':
qry = User.findOneAndUpdate({username: obj.username,}, {$push: {"data.electricity": newBill}});
break;
case 'water':
qry = User.findOneAndUpdate({username: obj.username}, {$push: {"data.water": newBill}});
break;
case 'gas':
qry = User.findOneAndUpdate({username: obj.username}, {$push: {"data.gas": newBill}});
break;
default:
break;
}
После создания категории я не хочу, чтобы объекты дублировались внутри, поэтому я использую DAY & Year в качестве идентификатора, чтобы соответствовать намерению перезаписать, если вставлено повторяющееся значение. Я пробовал несколько способов обновления, но ни один не работает. Пожалуйста, совет, эксперт mongoDb нуждался в
console.log("duplicate qry")
switch (category) {
case 'internet':
qry = User.findOneAndUpdate({username: obj.username}, {$push: {"data.internet": newBill,$position: index}});
break;
case 'electricity':
qry = User.updateOne({username: obj.username, month:newBill.month, year:newBill.year}, {$set: {"data.electricity.$": newBill}});
console.log("Inside db case "+index)
break;
case 'water':
qry = User.findOneAndUpdate({username: obj.username}, {$push: {"data.water": newBill,$position: index}});
break;
case 'gas':
qry = User.findOneAndUpdate({username: obj.username}, {$push: {"data.gas": newBill,$position: index}});
break;
default:
break;
}
}
Мой обработчик использовал два запроса для поиска и обновления, если не было дублированного объекта. Если он присутствует, он возвращает индекс дублированного объекта, который я могу использовать для моего второго qry
//insert & update data
app.post('/update', function (req, res) {
let obj = req.body
let category = obj.category
let insertObj = obj.data
let flag = false;
let index = 0;
db.getUserDoc(req.body).then(function (data) {
// console.log(data.doc)
let keys = Object.keys(data.doc)
console.log(`${category}`)
if (keys.includes(`${category}`)) {
let catObj = data.doc[`${category}`]
let nestedKeys = Object.keys(catObj);
let nestedVals = Object.values(catObj)
for (let i = 0; i < catObj.length; i++) {
if (catObj[i].month === insertObj.month && catObj[i].year === insertObj.year) {
console.log("not unique " + i)
flag = true;
index = i;
console.log(catObj.length);
}
}
// console.log(insertObj.month + " "+ insertObj.year)
console.log(catObj.length);
}
db.update(req.body, obj.data, obj.category, flag, index).then(function (data) {
// res.setHeader('Content-Type', 'text/plain');
// res.end(data)
console.log(data);
res.end(JSON.stringify(200));
}).catch(function (e) {
return res.status(500, {
error: e
})
});
// console.log(typeof data)
// console.log(data);
// res.end(JSON.stringify(data.doc));
})
})