Moon goose обновление массива поддокументов - PullRequest
0 голосов
/ 29 марта 2020

Я хочу обновить один объект массива subdo c с помощью findByIdAndUpdate по родительскому идентификатору и subdo c идентификатору объекта. При выполнении этого кода я получил эту ошибку:

The positional operator did not find the match needed from the query.

Когда я использую updateOne с параметром фильтра, он работает. Но я хотел бы, чтобы обновленный документ возвращался как json для остальных API.

Есть ли способ получить обновленный документ?

Мой код:

Subject.findByIdAndUpdate(
  { _id: req.params.subjectId, "bookmarks._id": req.params.bookmarkId },
  {
    $set: {
      "bookmarks.$.uri": req.body.uri
    }
  },
  { new: true }
)

Схема:

{
    "_id": "5e7fbfc05ff6be1446b51af7",
    "user_id": "5e7e68c3fd5e9404ce6a14a3",
    "title": "Hello World",
    "date": "2020-03-28T21:21:04.434Z",
    "bookmarks": [
        {
            "date": "2020-03-28T21:21:20.806Z",
            "_id": "5e7fbfd05ff6be1446b51afa",
            "uri": "lorem ipsum"
        },
        {
            "date": "2020-03-28T21:21:21.433Z",
            "_id": "5e7fbfd15ff6be1446b51afb",
            "uri": "lorem ipsum"
        }
    ]
}

1 Ответ

1 голос
/ 29 марта 2020

Вы должны использовать .findOneAndUpdate () :

Поскольку ваши req.params.subjectId и req.params.bookmarkId являются строками, и соответствующие поля в вашей БД будут иметь тип ObjectId() - так преобразовать строки в ObjectId (), используя следующий код:

const mongoose = require('mongoose');
const _id = mongoose.Types.ObjectId(req.params.subjectId);
const bookmarkId = mongoose.Types.ObjectId(req.params.bookmarkId);

Subject.findOneAndUpdate(
  { _id: _id, "bookmarks._id": bookmarkId },
  {
    $set: {
      "bookmarks.$.uri": 'new new'
    }
  },
  { new: true }
)

Ваша проблема должна быть mon goose '* .findByIdAndUpdate() действительно принимает только одно строковое значение и внутренне преобразует его в {_id : ObjectId(req.params.subjectId)} для использования .findOneAndUpdate(), это просто обертка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...