升级到3.0 mongo驱动程序后,我在更新请求时收到一些新错误。对于这样的更新:
db.table.update({_id: .... } , {$set : { "tags.Tag1" : true }});
我正在接收
cannot use the part (tags of tags.Tag1) to traverse the element ({tags: null})]]
问题是我的更新文档已包含tags
的默认值:null。如果我手动将其从文档中删除,则更新开始正常工作。这对我来说是一些新的行为,它是在将mongo驱动程序从2更新为3后发生的(甚至不是数据库本身)。
但现在我想知道如何避免这个错误。我当然可以检查“标签”是否已经定义,然后只对元素或整个地图进行$set
。但它意味着3个请求与一个旧的和其他问题,如原子性。
答案 0 :(得分:4)
虽然这是一个老帖子,但我认为你要找的是$ positional operator
我猜你的“标签”是一个数组。所以上面的例子可能就像
db.table.update({_id: .... } , {$set : { "tags.$.Tag1" : true }});
希望它有所帮助!
答案 1 :(得分:1)
是的,可以更新...我已经解决了类似的问题
已解决此
db.table.updateById({_id: .... } , {$set : { "levelSpecificData.scale.uom": "feet"}});
5b1f566ed65c7dcc34aaa7d5 MongoError: cannot use the part (scale of levelSpecificData.scale.uom) to traverse the element ({scale: false})
在我的收藏集“ levelSpecificData.scale ”中,其中的一个是布尔类型T / F
我将 levelSpecificData.scale 的默认值类型更改为'{}'空对象 ...令人惊讶的是,在将默认值更改为object后,它可以正常工作,因为我想要将 scale 当作对象引用,此解决方案对此非常有用。