1. ホーム
  2. node.js

[解決済み] Mongoose ドキュメント内の配列要素を削除して保存する

2022-12-07 12:35:41

質問

モデルドキュメントに配列があります。 その配列の要素を私が指定したキーに基づいて削除し、MongoDBを更新したいと思います。 これは可能ですか?

以下は私の試みです。

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var favorite = new Schema({
    cn: String,
    favorites: Array
});

module.exports = mongoose.model('Favorite', favorite, 'favorite');

exports.deleteFavorite = function (req, res, next) {
    if (req.params.callback !== null) {
        res.contentType = 'application/javascript';
    }
    Favorite.find({cn: req.params.name}, function (error, docs) {
        var records = {'records': docs};
        if (error) {
            process.stderr.write(error);
        }
        docs[0]._doc.favorites.remove({uid: req.params.deleteUid});

        Favorite.save(function (error, docs) {
            var records = {'records': docs};
            if (error) {
                process.stderr.write(error);
            }
            res.send(records);

            return next();
        });
    });
};

今のところ、ドキュメントは見つかりますが、削除も保存もうまくいきません。

どのように解決するのですか?

ドキュメントを読み込んでコードで修正しなくても、MongoDBで直接更新を行うこともできます。そのためには $pull あるいは $pullAll 演算子を使って、配列から項目を削除します。

Favorite.updateOne({ cn: req.params.name }, {
    $pullAll: {
        favorites: req.params.deleteUid,
    },
});

配列からオブジェクトを削除するには

Favorite.updateOne({ cn: req.params.name }, {
    $pullAll: {
        favorites: [{_id: req.params.deleteUid}],
    },
});

(複数のドキュメントに対してupdateManyを使用することもできます)

http://docs.mongodb.org/manual/reference/operator/update/pullAll/