MongoDB findOneAndUpdate обновляет, но ничего не меняется - PullRequest
1 голос
/ 20 апреля 2020

У меня есть кластер на атласе. Мой текущий объект выглядит следующим образом:

 {
   "_id": {
      "$oid":"5e9d8ccfb3d80e3824bf856c"
   },
   "user": {
      "name":"test",
      "channelGroups": [
         {
            "active": true,
            "name": "an example of test",
            "creationDate": "20 Apr 2020 at 13:35 PM",
            "summary": "an example summary",
            "channels": []
         }
      ]
   },
   "__v": {
      "$numberInt":"0"
   }
}

Вот мой метод контроллера: (я использую mon goose с express)

createANewChannel: (req, res) => {

    channelGroupModel.findOneAndUpdate({
            "user.name": "test", "user.channelGroups": {
                $elemMatch: {
                    "name": "an example of test"  // req.params.slug
                }
            }
        }, { $push: {
                    "channelGroups.channels": {
                        filter: {
                            keyword: "#example",
                            keywordType: "hashtag",
                            active: true,
                            fetchFrequency: 1,
                        },
                        tweets: []
                    }
                }
        },
        (error, success)  => {
            if (error) {
                console.log(error);
            } else {
                console.log(success);
            }
        }
    );


    res.send('ok');
},

Проблема : Я хочу добавить sh новый объект канала в массив channelGroups в соответствии со значением имени channelGroups. Мой код работает, но ничего не происходит.

==================================== ================================

Обновленная рабочая версия :

channelGroupModel.findOneAndUpdate(
    {
        "user.name": "test"
    },
    {
        $push: {
            "user.channelGroups.$[elem].channels": {
                filter: {
                    keyword: "#example",
                    keywordType: "hashtag",
                    active: true,
                    fetchFrequency: 1,
                },
                tweets: []
            }
        }
    },
    {
        arrayFilters: [{"elem.name": "an example of test"}]
    },
    (error, success) => {
        if (error) {
            console.log(error);
        } else {
            console.log(success);
        }
    }
)

1 Ответ

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

Вы хотите использовать arrayFilters :

channelGroupModel.findOneAndUpdate(
    {
        "user.name": "test"
    },
    {
        $push: {
            "channelGroups.$[elem].channels": {
                filter: {
                    keyword: "#example",
                    keywordType: "hashtag",
                    active: true,
                    fetchFrequency: 1,
                },
                tweets: []
            }
        }
    },
    {
        arrayFilters: [{"elem.name": "an example of test"}]
    },
    (error, success) => {
        if (error) {
            console.log(error);
        } else {
            console.log(success);
        }
    }
)

Просто FYI mongoose имеет пресловутую ошибку в определенных версиях, когда дело доходит до arrayFilters .

...