如何仅在嵌入式数组 Mongoose 中使用 findOneAndUpdate 来投影更新值?
How to project updated values only using findOneAndUpdate in embedded array Mongoose?
目前我的用户模型如下所示:
{
_id: 'SomeId'
firstName: 'John',
lastName: 'Cena',
books: [
{
_id: 'xyz',
title: 'a',
author:'b',
ratings:[
{source:'source1', value:"8"},
{source:'source2', value:"9"}]
},
{
_id: 'abc',
title: 'c',
author:'d',
ratings:[
{source:'source3', value:"7"},
{source:'source4', value:"5"}]
}
]
}
对 update rating=>value of 1st book object(_id: "xyz") from 8 to 10 for a given source(say "source1")
进行 findOneAndUpdate 查询后:
let up={
'books.$[book].ratings.$[rating].value':10
}
let filter={
new:true,
'books.rating':1, //I just want rating array of updated objects in it
arrayFilters:[
{ 'book._id':'xyz'},
{ 'rating.source': 'source1'}
]
}
User.findOneAndUpdate({'_id':'userId','books._id':'xyz'},up,filter).select('books.rating').exec((err,doc)=> {
if (err) throw err;
console.log(doc);
}
我的代码正确地更新了书籍 => 评级 => 值,但我无法获得那本书的更新评级。
这使我对所有具有更新和未更新值的书籍进行了评级。看起来像:-
{
books: [{ ratings:[{source:'source1', value:"10"},{source:'source2', value:"9"}] },
{ ratings:[{source:'source3', value:"7"},{source:'source4', value:"5"}] }]
}
我认为根据我的代码,第二本书的数据根本不应该存在。我期待以下输出:
{
books: [{ ratings:[{source:'source1', value:"10"}] }
}
请帮助我正确编写 findOneAndUpdate
查询!
您可以像这样使用 array.find():
const updatebookSource = (sourceId, userId, bookId) => {
User.findOneAndUpdate({ _id: userId, "books._id": bookId }, up, filter).exec(
(err, doc) => {
if (err) throw err;
let res = doc.books[0].ratings.find(rating => {
return rating.source === sourceId;
});
console.log(JSON.stringify(res, null, 1));
}
);
};
此 returns 更新后的对象。让我知道它是否有效。
目前我的用户模型如下所示:
{
_id: 'SomeId'
firstName: 'John',
lastName: 'Cena',
books: [
{
_id: 'xyz',
title: 'a',
author:'b',
ratings:[
{source:'source1', value:"8"},
{source:'source2', value:"9"}]
},
{
_id: 'abc',
title: 'c',
author:'d',
ratings:[
{source:'source3', value:"7"},
{source:'source4', value:"5"}]
}
]
}
对 update rating=>value of 1st book object(_id: "xyz") from 8 to 10 for a given source(say "source1")
进行 findOneAndUpdate 查询后:
let up={
'books.$[book].ratings.$[rating].value':10
}
let filter={
new:true,
'books.rating':1, //I just want rating array of updated objects in it
arrayFilters:[
{ 'book._id':'xyz'},
{ 'rating.source': 'source1'}
]
}
User.findOneAndUpdate({'_id':'userId','books._id':'xyz'},up,filter).select('books.rating').exec((err,doc)=> {
if (err) throw err;
console.log(doc);
}
我的代码正确地更新了书籍 => 评级 => 值,但我无法获得那本书的更新评级。 这使我对所有具有更新和未更新值的书籍进行了评级。看起来像:-
{
books: [{ ratings:[{source:'source1', value:"10"},{source:'source2', value:"9"}] },
{ ratings:[{source:'source3', value:"7"},{source:'source4', value:"5"}] }]
}
我认为根据我的代码,第二本书的数据根本不应该存在。我期待以下输出:
{
books: [{ ratings:[{source:'source1', value:"10"}] }
}
请帮助我正确编写 findOneAndUpdate
查询!
您可以像这样使用 array.find():
const updatebookSource = (sourceId, userId, bookId) => {
User.findOneAndUpdate({ _id: userId, "books._id": bookId }, up, filter).exec(
(err, doc) => {
if (err) throw err;
let res = doc.books[0].ratings.find(rating => {
return rating.source === sourceId;
});
console.log(JSON.stringify(res, null, 1));
}
);
};
此 returns 更新后的对象。让我知道它是否有效。