给定一个包含文档的集合,这些文档包含一个包含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);
})
答案 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 $
运算符不适用于:
它不是可用于删除元素的任何有效参数。
甚至与$set
一起使用,然后"设置" false
的值,您只能匹配数组中匹配的第一个元素。无论如何,你没有删除该项目,仍然需要使用pull。
此外,对于您的JavaScript方法,您正在寻找的typeof()
不会返回object
以外的任何内容,而这正是JavaScript实现的内容。你必须以另一种方式进行测试。
但不要。使用本机更新方法是最佳方式。