Как проецировать обновленные значения только с помощью findOneAndUpdate во встроенный массив Mongoose? - PullRequest
0 голосов
/ 14 октября 2019

В настоящее время моя модель пользователя выглядит следующим образом:

{
  _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"}] 
   }
 ]
}

После выполнения запроса findOneAndUpdate для update rating=>value of 1st book object(_id: "xyz") from 8 to 10 for a given source(say "source1"):

  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);
  }

Мой код обновляет значение книги => rating => правильноно я не могу получить этот обновленный рейтинг этой книги. Это дает мне рейтинг всех книг с обновленными и не обновленными значениями в нем. Похоже: -

{
  books: [{ ratings:[{source:'source1', value:"10"},{source:'source2', value:"9"}] },
          { ratings:[{source:'source3', value:"7"},{source:'source4', value:"5"}] }]
} 

Я думаю, что данные 2-й книги не должны быть там вообще, согласно моему коду. Я ожидаю следующий вывод:

{
  books: [{ ratings:[{source:'source1', value:"10"}] }    
}

Пожалуйста, помогите мне правильно написать findOneAndUpdate запрос!

1 Ответ

2 голосов
/ 15 октября 2019

вы можете использовать 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));
    }
  );
};

Возвращает обновленный объект. Дайте мне знать, если это работает.

...