从猫鼬中的数组中删除元素

Posted

技术标签:

【中文标题】从猫鼬中的数组中删除元素【英文标题】:Remove element from array in mongoose 【发布时间】:2018-05-28 15:48:29 【问题描述】:

我正在研究 nodejs/express

我想在 mongoose 中删除数组中的元素

我有这种格式的文件

 
    "_id" : ObjectId("5a2e19223e50551504b316c0"), 
    "username" : "nikhil", 
    "email" : "nikhil@itradicals.com", 
    "password" : "$2a$10$f3NvrTywIezlzKcZLWSU0O98gn6Mc.Q8B0ZNEDG2F66f4rwyo65Yu", 
    "companyname" : "itr", 
    "role" : "vendor", 
    "verify" : "true", 
    "createddate" : ISODate("2017-12-10T18:30:00.000+0000"), 
    "account" : [
        
            "Region" : [
                "North America", 
                "Africa", 
                "Asia"
            ]
        , 
        
            "Category" : [
                "Group 1", 
                "Group 2", 
                "Group 3"
            ]
        
    ]

我想使用我得到的 mongoose 查询仅删除 Region 字段 动态数据,因此用户可以删除任何数组,无论是区域还是 类别。我正在获取要在参数中删除的数组名称 “场地”。

module.exports.setupAccount = function(id,field,callback)
        var query =  _id: id;
        User.findOneAndUpdate(query, $set:  account.Region:[] , callback);

我是 nodejs 和 mongoose 的新手 提前致谢

【问题讨论】:

【参考方案1】:

如果您不想在删除字段后保留空文档,您可以简单地 $pull 数组中的整个元素:

module.exports.setupAccount = function(id,field,callback)
    var query =  _id: id ;
    User.findOneAndUpdate(query,  $pull:  "account":  field:  $exists: true    , callback);

【讨论】:

我用这个和那个帮助我解决我的问题领域是动态的,所以我需要在括号中使用它。 使用 [field] 为我做。【参考方案2】:

您可以使用以下功能。

使用计算属性名称将字段动态传递给未设置和查询表达式。

查询以验证数组是否存在,然后通过$unset 删除数组。

$ 位置运算符根据查询条件动态定位数组。如果您知道数组位置,则可以对数组索引进行硬编码。

module.exports.setupAccount = function(id, field, callback)
   var query =  "_id": id, ['account.' + field]:"$exists":true;
   var unset = "$unset":['account.$.' + field]:"";
   User.findOneAndUpdate(query, unset, callback);

【讨论】:

感谢您的帮助,但它留下了空文档。我不需要空文档

以上是关于从猫鼬中的数组中删除元素的主要内容,如果未能解决你的问题,请参考以下文章

你如何从猫鼬中删除模型?

如何从猫鼬中获取类型化的对象

将元素推送到猫鼬中的数组

是否有一种解决方案允许从猫鼬中完全相同的快照中读取多个集合?

从猫鼬聚合管道中的数组数组中获取单个数组

如何使用节点 js 从猫鼬模式中读取嵌套数组元素?