MongoDB实现数组元素不存在时新增元素的技术问询
解决MongoDB数组元素不存在时添加的问题
我来帮你搞定这个MongoDB数组更新的问题!首先得指出你原语句里的逻辑问题,再给你正确的实现方式。
原语句的问题所在
你写的查询条件{'_id' : ObjectId("5a6ef287370ff5dc3d6fda7b"), 'hobbies.name' : 'sport'}是在匹配已经包含name为sport的hobbies元素的文档,但你想要的是当这个元素不存在时才执行添加操作,这个条件刚好搞反了。而且加上upsert: true后,当元素不存在时,查询匹配不到原文档,反而会新建一个无关的空文档,完全不符合你的预期。
正确的更新语句
我们需要用$ne(不等于)来定位没有包含sport元素的目标文档,再结合$addToSet来实现“不存在则添加”的需求:
db.getCollection('milo').update( { '_id' : ObjectId("5a6ef287370ff5dc3d6fda7b"), 'hobbies.name' : { $ne: 'sport' } // 匹配hobbies中没有sport的文档 }, { $addToSet : { 'hobbies' : { 'name' : 'sport', '_id' : ObjectId() // 自动生成新的ObjectId,也可以手动指定你想要的ID值 } } }, { upsert: false } // 不需要upsert,我们明确要更新已存在的目标文档 )
效果验证
执行完这条语句后,你的文档会变成你期望的样子:
{ "_id" : ObjectId("5a6ef287370ff5dc3d6fda7b"), "name" : "Jhones Crows", "hobbies" : [ { "name" : "swim", "_id" : ObjectId("5a6ef287370ff5dc3d6fda7b") }, { "name" : "run", "_id" : ObjectId("5a6ef287370ff5dc3d6fda7c") }, { "name" : "sport", "_id" : ObjectId("5a6ef287370ff5dc3d6fda7a") } ] }
如果再次执行这条语句,因为hobbies.name已经存在sport,查询条件无法匹配,update不会执行任何操作,不会出现重复添加的情况。
补充说明
$addToSet本身就有“仅添加不存在元素”的特性,但结合'hobbies.name': {$ne: 'sport'}的查询条件,可以避免对已经包含目标元素的文档做无意义的查询和判断,提升操作效率。
内容的提问来源于stack exchange,提问作者kyty
相关产品推荐
相关产品推荐

