MongoDB: обновление объекта в массиве документа

#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