我想更新bookData数组中的percentageOfReading变量,你们能帮我吗?
这是我的数据库结构:
{
"_id": {
"$oid": "61181e4243613b2e643630cf"
},
"ownerId": "tKfJT-a6",
"libraryId": "PRhs40DA",
"libraryName": "Igor's Library",
"__v": 0,
"books": [{
"bookData": {
"bookId": "-DgQCwAAQBAJ",
"percentageOfReading": 0
}
}]
}
因此,我想将percentageOfReading值从0更改为任何其他数字,并且我使用了此代码,但无论如何它是错误的:
libraryModel.updateOne({'books.bookId': bookId}, {'$set': {
'books.$.bookData.percentageOfReading': `${readingPercentage}`
}}, function err() {
console.log("Erro")
});
过滤器文档应该指定books.bookData.bookId
,而不是books.bookId
。
libraryModel.updateOne(
{'books.bookData.bookId': bookId},
{'$set': {'books.$.bookData.percentageOfReading': `${readingPercentage}`}},
function(error) {
console.error(error.message,error.stack)
}
);
香草溶液
一定要记住books是一个对象数组,a是libraryModel
的嵌套子对象。
首先找到library
;遍历图书的books
子集合,访问属性进行更新,然后使用发出的library参数保存。
这是我如何用好的老香草技术解决你的问题。
libraryModel.findOne({ 'ownerId': 'tKfJT-a6' }).exec((err, library) => {
if (err) {
throw err
}
library.books.filter(book => book.bookData.bookId === '-DgQCwAAQBAJ')[0]
.bookData.percentageOfReading = 95;
library.save()
})
推荐通过避免子集合上的嵌套对象来简化模式。这将加快数据检索的速度,因为代码将更加简洁。
const recommendedLibrary = new mongoose.Schema({
ownerId: String,
libraryId: String,
libraryName: String,
books: [{
bookId: String,
percentageOfReading: Number
}]
})
- 考虑上述问题中的
update
语句将是有效的。