Я пытаюсь обновить определенное поле в под-документе на основе его Id и Id родительского документа. Я новичок в этом, поэтому я могу неправильно понять документацию mongoDb, но насколько я могу судить, findOneAndUpdate должен работать. Я также пытался просто обновить, updateOne, а также findByIdAndUpdate. Ничто из того, что я пробовал, не обновило мой объект.
Я пытаюсь обновить значение рейтинга в конкретном объекте в массиве saveBeers.
Вот моя модель:
{
"_id": {
"$oid": "5c97cf50cc81525a75eb6c19"
},
"email": "[email protected]",
"password": "$2b$10$6ixbu2Ka.Zj0eE5kF21MLO6CiMblgu4D6IHiC7Ta52o.cZFMNw1Mm",
"__v": 0,
"savedBeers": [
{
"id": 2,
"comment": null,
"rating": 0
},
{
"id": 4,
"comment": null,
"rating": 0
},
{
"id": 8,
"comment": null,
"rating": 0
}
]
}
Внешний интерфейс:
function addRating(beerId, ratingValue){
let userId= localStorage.userId
console.log(beerId, userId, ratingValue);
$.ajax({
type: "PUT",
url: '/user/${userId}/${beerId}/${ratingValue}',
success: addRatingSuccess,
error: addRatingError
});
function addRatingSuccess(response) {
console.log("added", response);
}
function addRatingError() {
console.log("error");
}
}
Backend userController.js:
addRating:(req,res)=>{
console.log(req.params);
try{
db.User.findByIdAndUpdate(
{_id: req.params.userId, "savedBeers.id": req.params.beerId },
{ $set: { 'savedBeers.$' <<tried savedBeers.$.rating here as well>> : req.params.ratingValue } },
function(err, data) {
if(err){
console.log(err);
} else {
console.log("data",data);
res.json({
data
})
}
}
)}
catch(e){
print(e)
}
Я тоже это пробовал, но всегда получаю один и тот же результат:
addRating:(req,res)=>{
console.log(req.params);
try{
db.User.findOneAndUpdate(
{_id: req.params.userId},
{ $set: { 'savedBeers.$.rating' : req.params.ratingValue } },
{arrayFilter: {'savedBeers.id' :{$eq:req.params.beerId}}},
function(err, data) {
if(err){
console.log(err);
} else {
console.log("data",data);
res.json({
data
})
}
}
)}
catch(e){
print(e)
}
Насколько я понимаю, я не должен получать документ обновления, но он все еще не обновляется на моем сервере. И я не получаю никаких ошибок, поэтому я не уверен, что делать.
Это ответ, который я получаю в передней части:
added
{data: {…}}
data:
email: "[email protected]"
savedBeers: Array(3)
0: {id: 2, comment: null, rating: 0}
1: {id: 4, comment: null, rating: 0}
2: {id: 8, comment: null, rating: 0}
length: 3
__proto__: Array(0)
__v: 0
_id: "5c97cf50cc81525a75eb6c19"
__proto__: Object
__proto__: Object
И бэкэнд:
{ userId: '5c97cf50cc81525a75eb6c19',
beerId: '8',
ratingValue: '4' }
data { savedBeers:
[ { id: 2, comment: null, rating: 0 },
{ id: 4, comment: null, rating: 0 },
{ id: 8, comment: null, rating: 0 } ],
_id: 5c97cf50cc81525a75eb6c19,
email: '[email protected]',
__v: 0 }
Извините, если я совершенно не понимаю, как это должно работать, но я также попросил нескольких людей, более опытных, чем я, и они тоже не могли этого понять.
Большое спасибо, что нашли время. Пожалуйста, дайте мне знать, если есть какая-либо другая информация, которая будет полезна.
Похоже, что вы пропускаете ".rating" после "saveBeers. $" В "{$ set: {'SavedBeers. $': Req.params.ratingValue}"
Таким образом, эта строка должна быть "{$ set: {'saveBeers. $. Rating': req.params.ratingValue}"
findByIdAndUpdate()
так как он принимает только значение_id
.findOneAndUpdate()
этого вы хотите использоватьfindOneAndUpdate()
а также, как правило, хотитеnew: true
с любым из них. Не откроется, так как связанный ответ действительно является ответом, просто вы все еще делаете неправильно. Прочитайте ответы и связанную документацию еще раз.