Mongo更新所有字段为空的记录

11

如何更新所有Mongo文档,其中某个字段设置为“null”,或者根本没有值?

我目前有以下代码,但不确定是否正确:

db.collection.update({name: {$eq: null}}, {$set: {name: 'test'}})
2个回答

28

如果没有名字字段,请尝试:

db.collection.update({"name": {"$exists": false}}, {"$set": {"name": "test"}})

$set会添加一个具有指定值的新字段,前提是该新字段不违反类型限制。

如果该字段存在但为空或未设置值:

db.collection.update({"name": null}, {"$set": {"name": "test"}})
你可以使用$or将这两个查询组合起来。
db.collection.update(
    {
        "$or": [
            { "name": { "$exists": false } }, 
            { "name": null }
        ]
    }, 
    { "$set": { "name": "test" } }
)
对于MongoDB 3.2及以上版本,请使用updateMany()函数,它可以基于筛选器在集合中更新多个文档:
db.collection.updateMany(
    {
        "$or": [
            { "name": { "$exists": false } }, 
            { "name": null }
        ]
    }, 
    { "$set": { "name": "test" } }
)

1
你可以使用 $or 来代替编写两个不同的查询。 - styvane
但是,@Michael,db.collection.find({ "$or": [ { "name": { "$exists": false } }, { "name": null } ] }) 不就等同于 db.collection.find({"name": null}) 吗? - chridam
不,这并不相同。db.collection.find({"name": null}) 只有在 name 存在且为 null 时才会返回文档。 - styvane
你会在哪里添加 {multi: true} 来更新多条记录? - reectrix
docs中可以看到,update的形式为db.collection.update(<query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> }),因此{multi: true}选项应该放在update对象之后。 - chridam
1
如果想要更新所有文档,请使用 updateMany 而不是 update。 - imalik8088

2

试试这个

 db.collection.findAndModify({
    query: {'$or': [{'name': {$eq: null}}, {'name': {"$exists":false}},{ field: { "$type" : 10} }]},
    update: {$set: {name: 'test'}},
});

谢谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接