当前位置:  开发笔记 > 编程语言 > 正文

MongoDB:使用同一文档中的数据更新文档

如何解决《MongoDB:使用同一文档中的数据更新文档》经验,为你挑选了2个好方法。

我有一个文档列表,每个文档都有lat和lon属性(等等).

{ 'lat': 1, 'lon': 2, someotherdata [...] } 
{ 'lat': 4, 'lon': 1, someotherdata [...] }
[...]

我想修改它,使它看起来像这样:

{ 'coords': {'lat': 1, 'lon': 2}, someotherdata [...]} 
{ 'coords': {'lat': 4, 'lon': 1}, someotherdata [...]}
[...]

到目前为止,我有这个:

db.events.update({}, {$set : {'coords': {'lat': db.events.lat, 'lon': db.events.lon}}}, false, true)

但它将db.events.latdb.events.lon视为字符串.如何引用文档的属性?

干杯.



1> Niels van de..:

更新:如果您只需更改文档的结构而不更改值,请参阅gipset的答案以获得更好的解决方案.


根据更新文档页面上的(现在不可用)注释,您无法从中引用当前文档的属性update().

你必须遍历所有文档并像这样更新它们:

db.events.find().snapshot().forEach(
  function (e) {
    // update document, using its own properties
    e.coords = { lat: e.lat, lon: e.lon };

    // remove old properties
    delete e.lat;
    delete e.lon;

    // save the updated document
    db.events.save(e);
  }
)

db.eval()根据您的需要,此类功能还可用于map-reduce作业或服务器端作业.


根据对类似问题的评论,我发现如果没有快照()查找结果,在某些情况下会将光标抛到无限循环中.[更新字段包含其他字段的值](http://stackoverflow.com/questions/2606657/how-can-i-update-field-with-another-fields-value#comment15682010_4260176)尝试`db.events.find() .snapshot().forEach(``//..function goes here``)`
@AlbertRothman,对于mongo 4.0,使用`.hint({_ id:1})`而不是`.snapshot()`.

2> 小智..:

在$重命名操作(介绍这个问题被张贴一个月后),使得它很容易做这些事情,你并不需要修改的值.

插入一些测试文档

db.events.insert({ 'lat': 1, 'lon': 2, someotherdata: [] })
db.events.insert({ 'lat': 4, 'lon': 1, someotherdata: [] })

使用$rename运营商

db.events.update({}, {$rename: {'lat': 'coords.lat', 'lon': 'coords.lon'}}, false, true)

结果

db.events.find()
{
    "_id" : ObjectId("5113c82dd28c4e8b79971add"),
    "coords" : {
        "lat" : 1,
        "lon" : 2
    },
    "someotherdata" : [ ]
}
{
    "_id" : ObjectId("5113c82ed28c4e8b79971ade"),
    "coords" : {
        "lat" : 4,
        "lon" : 1
    },
    "someotherdata" : [ ]
}

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有