#arrays #mongodb #object
#массивы #mongodb #объект
Вопрос:
У меня есть следующая коллекция :
{
"_id": "5fcde7d433d4303b242a8048",
"model": "CL",
"type": "ARCHCOMP",
"idProject": "5fcde7d133d4303b242a8041",
"qtts": [
{
"component": "5fca0fbac09bc7bca5628256",
"qttEU": 5,
"qttUSA": 10,
"qttAS": 20
},
{
"component": "5fca136ec09bc7bca5628257",
"qttEU": 10,
"qttUSA": 15,
"qttAS": 25
}
]
},
{
Other documents...
}
Мне нужно обновить поля ‘qttEU’, ‘qttUSA’ и ‘qttAS’ определенного компонента (идентификатор которого указан) определенного документа (идентификатор которого тоже указан), но я не могу заставить его работать…
Вот что я пробовал :
Document.updateOne({ _id: "5fcde7d433d4303b242a8048", "qtts.component": "5fca0fbac09bc7bca5628256" },
{ $set: {"qtts.$.qttEU": 11, "qtts.$.qttUSA": 12, "qtts.$.qttAS": 13 }})
Я получаю ответ, что документ был успешно обновлен, но когда я проверяю базу данных, значения не обновляются …
Если я запрашиваю базу данных с этим :
Document.findOne({ _id: "5fcde7d433d4303b242a8048", "qtts.component": "5fca0fbac09bc7bca5628256" })
он возвращает мне хороший документ. Я не понимаю, что я делаю не так.
Ответ №1:
Попробуйте выполнить этот запрос. qtts — это массив, поэтому вы должны использовать $elemMatch для сопоставления значений в массиве:-
Document.updateOne({ _id: "5fcde7d433d4303b242a8048", qtts:{ $elemMatch: { component: "5fca0fbac09bc7bca5628256"}}},
{ $set: {"qtts.$.qttEU": 11, "qtts.$.qttUSA": 12, "qtts.$.qttAS": 13 }})
Комментарии:
1. Большое спасибо, вы дали мне половину решения проблемы 🙂
Ответ №2:
Хорошо, я решил это.
Во-первых, я неправильно выполнял свой запрос. Как мне ответил AartiVerma, я должен сделать
Document.updateOne({ _id: "5fcde7d433d4303b242a8048", qtts:{ $elemMatch: { component: "5fca0fbac09bc7bca5628256"}}},
{ $set: {"qtts.$.qttEU": 11, "qtts.$.qttUSA": 12, "qtts.$.qttAS": 13 }})
Вместо
Document.updateOne({ _id: "5fcde7d433d4303b242a8048", "qtts.component": "5fca0fbac09bc7bca5628256" },
{ $set: {"qtts.$.qttEU": 11, "qtts.$.qttUSA": 12, "qtts.$.qttAS": 13 }})
Во-вторых, моя схема mongoose была неправильной. Это было похоже :
const mongoose = require('mongoose');
const sheetSchema = mongoose.Schema({
model: { type: String },
type: { type: String },
qtts: { type: Array },
idProject: { type: String }
});
module.exports = mongoose.model('Sheet', sheetSchema);
Вместо :
const mongoose = require('mongoose');
const sheetSchema = mongoose.Schema({
model: { type: String },
type: { type: String },
qtts: [{ component: String, qttEU: Number, qttUSA: Number, qttAS: Number }],
idProject: { type: String }
});
module.exports = mongoose.model('Sheet', sheetSchema);
Обратите внимание на разницу для qtts