Обновление вложенного вложенного документа в Mongoose - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь обновить вложенный поддокумент в Mongoose с помощью ExpressJS, но, похоже, не могу заставить его работать.Позиционный оператор $ не пересекает более 1 уровня, и я пытался использовать arrayFilters, но я также не могу заставить его работать.

Это документ:

{
    "_id" : ObjectId("5c52b017d9133d14876d2493"),
    "title" : "main_item",
    "subitem" : [ 
        {
            "_id" : ObjectId("5c52f4e74ef7482a646fc264"),
            "title" : "sub_item",
            "messages" : [ 
                {
                    "_id" : ObjectId("5c5303fa4b20df2d33d6eb08"),
                    "type" : "single_article",
                    "date" : "Jan 31, 2019",
                    "title" : "item",
                    "text" : "<p>item text</p>"
                }, 
                {
                    "_id" : ObjectId("5c53040b4b20df2d33d6eb09"),
                    "type" : "single_article",
                    "date" : "Jan 31, 2019",
                    "title" : "item 2",
                    "text" : "<p>item 2 text</p>"
                }
            ]
        }
    ],
    "__v" : 0
}

postController.updateMessage = function(req, res, item) {
  var id = req.body.id;
  var sub_id = req.body.sub_id;
  var saveData = {
    title: req.body.title,
    text: req.body.text
  };
  item.updateOne({'subitem._id': id}, {$set: {'subitem.$[el1].messages.$[el2]': saveData}}, {arrayFilters:[{"el1._id": id},{"el2._id": sub_id}]})
};

Мангуст модель:

var submessages = mongoose.Schema({
  date: String,
  type: String,
  title: String,
  text: String
});

var subitems = new mongoose.Schema({
  title: String,
  messages: [submessages]
});

var menuItems = new mongoose.Schema({
  title : String,
  subitem: [subitems]
}, {collection: 'menu_items'});

module.exports = mongoose.model("menu_items", menuItems);

1 Ответ

0 голосов
/ 04 февраля 2019

Я не знаю, есть ли у меня ответ о том, как точно решить вашу проблему, но я собираюсь рекомендовать решение, которое, по моему мнению, значительно повышает уровень организации в вашем коде ...

(1) Прежде всего, каждая из этих схем должна быть экспортирована в виде отдельных моделей (и я бы порекомендовал их каждая в отдельных файлах)

(2) Во-вторых, в схемах subitems и menuItems создайте ссылки на сообщения и подэлементы.Если вы последуете первому предложению, которое я сделал, вы можете создать свою схему menuItems следующим образом:

menuItems.js

const menuItems = new mongoose.Schema({
  title : String,
  subitem: {
    type: mongoose.Types.ObjectId,
    ref: 'sub_items'
  }
});

module.exports = mongoose.model("menu_items", menuItems);

Где sub_items - это имявашей модели подэлементов, которые вы экспортировали.Используйте аналогичный формат с вашей моделью подэлементов, но я позволю вам сделать это, потому что я не хочу красть все веселье;)

(3) Теперь, когда этоссылки, когда вам нужно изменить подэлемент, на который ссылается menuItem, вам просто нужно обновить фактический подэлемент.Вам больше не нужно обновлять подэлемент с по объект menuItem, поскольку ссылка на подэлемент никогда не меняется!

Надеюсь, это поможет.Это должно быть гораздо более организованным для вас сейчас, и должно быть на НАМНОГО проще для обновления ваших подпунктов и подтемсов

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