MongoDB с Nodejs (Express): удалить свойство в массиве документа - PullRequest
0 голосов
/ 05 декабря 2018

Предположим, у нас есть следующая коллекция, о которой у меня есть вопросы:

{
 "_id" : ObjectId("5c0798cfa572a912a7d93308"),
 "shop_name" : "Royal Foods",
 "address" : "Colombo",
 `"items" : [ 
    {
        "_id" : ObjectId("5c0798cfa572a912a7d9330d"),
        "item_name" : "Pasta",
    },
    {
        "_id" : ObjectId("5c0798cfa572a912a7d9330c"),
        "item_name" : "Noodles",
    },
    {
        "_id" : ObjectId("5c0798cfa572a912a7d9330b"),
        "item_name" : "Rice & Curry",
    }  
  ]
}

Я хочу удалить первый элемент, который называется «Pasta», не удаляя весь документ.Я хочу сделать это, используя delete restful API.Я использую Nodejs и Express для своей бэкэнд-разработки.Я попробовал следующее:

router.delete('/ninjas/:id', function(req,res){
      Shop.findByIdAndRemove({_id: req.params.id}).then(function(Shop{
        res.send(Shop);
      });
});

Но удаляется вся коллекция, когда я передаю идентификатор магазина в этот API.Мне нужно только удалить продукт "Макароны".

Ответы [ 4 ]

0 голосов
/ 05 декабря 2018

Я предполагаю, что вы используете mongoose.

Shop.findOneAndUpdate(
  { _id: req.params.id },
  { $pull: item_name: "Pasta" },
  { new: true }
).then(function(Shop{
  res.send(Shop);
});

Метод findByIdAndRemove удаляет весь документ, так как вы хотите только изменить его, вы должны использовать findOneAndUpdate

0 голосов
/ 05 декабря 2018

Ознакомьтесь с их документацией здесь .

Вы можете создать отдельный файл, например 'deletePasta.js', и вставить следующую строку.

db.{{databaseName}}.deleteOne( { "_id" : ObjectId("5c0798cfa572a912a7d9330d") } );

Просто вставьтеthe databseName в {{databaseName}}

mongo {{apiName}} < deletePasta.js

Вставьте это в свою консоль и замените {{apiName}} именем вашего API.

0 голосов
/ 05 декабря 2018

findByIdAndRemove находит документ и удаляет его.Было бы лучше, если бы у вас была отдельная модель для Item, но в любом случае, чтобы удалить конкретный элемент из массива элементов в документе, вы можете использовать метод фильтра Array.

Shop.findById(req.params.id,(err, foundShop) => {
    if(err) console.log(err);

    if(!foundShop) {
        // Shop Doesn't Exists
        res.send('Shop Doesn\'t exist');
    }

    if(foundShop) {
        // Shop Exists
        const filteredItems = foundShop.items.filter(item => item.item_name !== 'Pasta'); // Returns a new Array with the Item Pasta removed.
        foundShop.items = filteredItems;

        foundShop.save();

        res.send('Item has been removed from the array');
    }

});
0 голосов
/ 05 декабря 2018

Похоже, у вас есть синтаксическая ошибка в вашем маршрутизаторе:

router.delete('/ninjas/:id', function(req,res){
  Shop.findByIdAndRemove({_id: req.params.id}).then(function(Shop{
    res.send(Shop);
  });
});

В вашем обещании:

.then(function(Shop) { 
   res.send(Shop)
})

... будет правильным.Надеюсь, что это помогает, но весьма необычно возвращать такой объект Shop.

.then(function(result) { 
    res.send(result)
})

... это более распространенные шаблоны

Кроме того, findbyidandremove, вероятно, не возвращает удаленныйобъект.Вам нужно проверить онлайн-документацию (я полагаю, Мангуст)

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