MongoDB mon goose обновление elemMatch не работает, но когда запрос (найти) это нормально - PullRequest
1 голос
/ 29 апреля 2020

У меня возникли проблемы при обновлении с использованием $ elemMatch. Когда я пытаюсь сопоставить или найти, он показывает результат записи.

.updateOne(
        { _id: req.body.sid },
        { $pull: {comments: { $elemMatch: { fid: '5ea9c87d2d5c8f491cae8818' } }}}
     ).then((res)=>{
         console.log(res)
     }).catch((err)=>{
         console.log(err)
     })

В результате получается:

{ n: 1, nModified: 0, ok: 1 }

И это результат запроса с использованием команды find:

.find({
        $and: [
            { _id: req.body.sid },
            {comments: { $elemMatch: { fid: '5ea9c87d2d5c8f491cae8818' } }}
        ]
    }) 

Пример c результат поиска:

[
  {
    _id: 5ea88b12423e6e4b3ce01956,
    comments: [{"fid":"5ea9c87d2d5c8f491cae8818","comment":"ok"}, {"fid":"5ea9c87d2d5c8f491cae8899","comment":"ok"}],
    date: 2020-04-28T00:00:00.000Z,
    title: 'Fotos para o Álbum de ensaios',
    __v: 5
  }
]

Кто-нибудь может мне помочь? Спасибо !!

1 Ответ

1 голос
/ 29 апреля 2020

Вы можете попробовать, как показано ниже:

Если ваши документы выглядят примерно так:

/* 1 */
{
    "_id" : "5ea88b12423e6e4b3ce01956",
    "comments" : [ 
        {
            "fid" : "5ea9c87d2d5c8f491cae8818"
        }, 
        {
            "fid" : "5ea9c87d2d5c8f491cae8899"
        }
    ],
    "date" : "2020-04-28T00:00:00.000Z",
    "title" : "Fotos para o Álbum de ensaios",
    "__v" : 5.0
}

/* 2 */
{
    "_id" : "5ea88b12423e6e4b3ce01951",
    "comments" : [ 
        {
            "fid" : "5ea9c87d2d5c8f491cae8811"
        }, 
        {
            "fid" : "5ea9c87d2d5c8f491cae8899"
        }
    ],
    "date" : "2020-04-28T00:00:00.000Z",
    "title" : "Fotos para o Álbum de ensaios",
    "__v" : 5.0
}

Так что $ elemMatch не требуется для одного условия запроса, которое в вашем case {comments: { $elemMatch: { fid: '5ea9c87d2d5c8f491cae8818' } }} может быть просто "comments.fid": "5ea9c87d2d5c8f491cae8818", также вам не нужен оператор $and в вашем .find().

Запрос:

  /** Here "comments.fid" helps to filter doc, even though we'll get single doc based on `_id` filter but 
   * still adding this check prevents unnecessary update operation if `5ea9c87d2d5c8f491cae8818` doesn't exists in fid of comments in doc */

  .updateOne(
    { _id: req.body.sid, "comments.fid": "5ea9c87d2d5c8f491cae8818" }, 
    { $pull: { "comments" :{ "fid": "5ea9c87d2d5c8f491cae8818" } } }
  )
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.log(err);
  });
...