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

从MongoDB文档中的JSON数组字段中删除具有特定字段类型的JSON对象,mongodb,mongodb-query,Mongodb,Mongodb Query,给定一个集合,其中包含包含JSON对象(键值对)的数组字段的文档,例如: 更新后,相同的文档应如下所示: { ..., arr : [{key: val}]} arr字段中的文档: {key:NumberLong(100)} 应该删除 是否可以使用MongoDB$运营商进行此操作? 我尝试使用以下代码,但无效: db.coll.find({}).forEach( function(doc) { var objs = doc.arr; for(var i = objs.le

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

更新后,相同的文档应如下所示:

{ ..., 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);
})

我想您希望从如下数组中删除数据:

{ 
    "field" : "aaa", 
    "list" : [  "aaa",  NumberLong(123),  "bbb",  NumberLong(456) ] 
}
可以使用,因为它将查询表达式作为参数

 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}
添加到您希望在多个文档上执行此操作的位置

因此,为了匹配“NumberLong”元素,它使用了64位整数。每个“类型”的值都在手册页上

操作员不适合这里,因为:

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

  • 即使与值一起使用,然后将值“设置”为
    false
    ,也只能匹配数组中匹配的第一个元素。无论如何,您没有移除该项目,仍然需要使用pull

  • 另外,对于JavaScript方法,您要查找的
    typeof()
    不会作为
    对象以外的任何对象返回,而
    对象就是JavaScript实现的对象。你必须用另一种方式进行测试


    但是不要。使用本机更新方法是最好的方法。

    谢谢。对不起,我的问题搞错了。数组包含JSON对象。@user1264304,这对答案没有任何实际影响。我确实添加了您的具体示例,以向您展示如何。
     db.list.update({ }, { "$pull": { "list": { "key": {"$type": 18  } } } })