Удалите элементы вложенного документа с помощью $ pull - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь удалить элементы из вложенных документов, используя ExpressJS и Mongoose, но он удаляет только первые элементы, а не вложенные элементы.

Поэтому я хочу удалить «подраздел 2» в сообщениях Array Thisэто структура:

{
    "_id" : ObjectId("5c4ee94b30ebd71cbed89a35"),
    "title" : "Test",
    "subitem" : [ 
        {
            "_id" : ObjectId("5c4ee95630ebd71cbed89a36"),
            "title" : "Item 1",
            "messages" : [ 
                {
                    "_id" : ObjectId("5c4ee95f30ebd71cbed89a37"),
                    "type" : "single_article",
                    "date" : "Jan 28, 2019",
                    "title" : "subitem 1",
                    "text" : ""
                }
            ]
        }, 
        {
            "_id" : ObjectId("5c4ee96830ebd71cbed89a38"),
            "title" : "item 2",
            "messages" : [ 
                {
                    "_id" : ObjectId("5c4ee96e30ebd71cbed89a39"),
                    "type" : "single_article",
                    "date" : "Jan 28, 2019",
                    "title" : "subitem 2",
                    "text" : ""
                }
            ]
        }
    ],
    "__v" : 0
}

И это метод $ pull:

getController.deleteRec = function(req,res,collection){
  var id = req.params.id;
  console.log(id);
  collection.updateOne({'subitem.messages._id': id}, {$pull: {'subitem.0.messages': {"_id": id}}}).
    then(function(result){
      console.log(result);
    });
};

Теперь я знаю, почему он удаляет только первый элемент, потому что у меня есть "subitem.0.messages».Как я могу зациклить это, чтобы он мог удалить все элементы?

1 Ответ

0 голосов
/ 28 января 2019

Вы можете использовать $ в качестве подстановочного индекса, удаляя все элементы в массиве, соответствующие вашему запросу, например:

{$pull: {'subitem.$.messages': {"_id": id}}}

, если вы хотите удалить несколько документов:

{$pull: {'subitem.$.messages': {"_id": {$in : [id, id2, id3...]}}}}
...