从MongoDB文档中的JSON数组字段中删除具有特定字段类型的JSON对象

时间:2014-03-21 17:47:38

标签: mongodb mongodb-query

给定一个包含文档的集合,这些文档包含一个包含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);
})

1 个答案:

答案 0 :(得分: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位整数。每个"类型的值#34;在手册页上。

positional $运算符不适用于:

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

  2. 甚至与$set一起使用,然后"设置" false的值,您只能匹配数组中匹配的第一个元素。无论如何,你没有删除该项目,仍然需要使用pull。

  3. 此外,对于您的JavaScript方法,您正在寻找的typeof()不会返回object以外的任何内容,而这正是JavaScript实现的内容。你必须以另一种方式进行测试。

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