【问题标题】:Remove JSON objects which have specific field type from JSON array field in MongoDB document从 MongoDB 文档中的 JSON 数组字段中删除具有特定字段类型的 JSON 对象
【发布时间】:2014-04-29 05:52:07
【问题描述】:

给定一个包含包含 JSON 对象(键值对)的数组字段的文档的集合,例如:

{ ..., arr : [{key: val}, {key : NumberLong(100)}]}

更新后,相同的文档应该是这样的:

{ ..., arr : [{key: val}]}

arr 字段中的文档:

{key : NumberLong(100)}

应该被删除。

是否可以使用 MongoDB $ 运算符来做到这一点? 我尝试使用以下代码无济于事:

 db.coll.find({}).forEach( function(doc) {
     var objs = doc.arr;
     for(var i = objs.length; i--;){
         if (typeof(objs[i].ts) == NumberLong)
             objs.splice(i,1);
     }
     db.coll.save(doc);
})

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    我想您希望从这样的数组中删除数据:

    { 
        "field" : "aaa", 
        "list" : [  "aaa",  NumberLong(123),  "bbb",  NumberLong(456) ] 
    }
    

    您可以使用$pull 执行此操作,因为它需要一个查询表达式作为它的参数

     db.collection.update({ },{ "$pull": { "list": {"$type": 18 } } })
    

    编辑

    由于问题已经改变,但答案仍然没有太大变化:

    { 
        "list" : [
            { "key" : "val" }, 
            { "key" : NumberLong(100) },
            { "key" : NumberLong(123) } 
        ] 
    }
    

    并且使用基本相同的查询:

     db.list.update({ }, { "$pull": { "list": { "key": {"$type": 18  } } } })
    

    然后所有的NumberLong() 类型都被移除了。


    添加 { "multi": true } 您希望在多个文档中发生这种情况。

    所以它使用$type 来匹配“NumberLong”元素,它们是 64 位整数。每个“类型”的值都在手册页上。

    positional $ 运算符在这里不适合:

    1. 它不是任何可用于删除元素的有效参数。

    2. 即使与 $set 一起使用,然后将值“设置”为 false,您也只会匹配数组中匹配的 first 元素。无论如何,您并没有删除该项目,仍然需要使用拉取。

    此外,对于您的 JavaScript 方法,您正在寻找的 typeof() 不会以 object 以外的形式返回,这就是 JavaScript 实现的含义。您将不得不以另一种方式进行测试。

    但不要。使用本机更新方法是最佳方式。

    【讨论】:

    • 谢谢。对不起,我在我的问题中犯了一个错误。该数组包含 JSON 对象。
    • @user1264304 这对答案没有任何实际影响。我确实添加了您的具体示例来向您展示如何操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多