2011-08-09 16 views
5

ドキュメントは、私はので、私はMongoDBのコンソールでこれをしようとします。このMongoDBでフィールドを変更したり、高速に更新する方法は?

{title:"here", {latlng: {lat:123.4512, lng:36.3423}}, time:"2011-01-02"} 

ようchaneドキュメントをしたい、この

{title:"here", lat:123.4512, lng:36.3423, time:"2011-01-02"} 

です。

db.coll.find().forEach(function(u){ 
    u.latlng = {"lat":u.lat, "lng":u.lng}; 
    db.coll.save(u); 
    db.coll.update(u, {$unset:{"map_x1":1, "map_y1":1}}); 
}) 

しかし、それは非常に遅いT.T

だ私は別の解決策

db.coll.find().forEach(function(u){ 
    db.coll.update(u, {{"latlng" : {"lat":u.lat, "lng":u.lng}}, $unset:{"lat":1, "lng":1}}); 
}) 

と思うが、私はそれを実行することはできません。最初の解決策がまだ実行されているためです。

この仕事のような速い解決策はありますか?

答えて

10

あなたの2番目のクエリは、それが全体の文書、使用$セットを上書きしますので、壊れている:

db.coll.find().forEach(function(u){ 
    db.coll.update(u, {$set:{"latlng" : {"lat":u.lat, "lng":u.lng}}, $unset:{"lat":1, "lng":1}}); 
}) 

元の試みがあるので、あなたが同じを更新しているので、これは2倍以上速くなります文書は2度必要ではありません。

+0

mongoはどのようにこのようなコマンドを処理しますか?私はいくつかの怠惰な評価をし、コレクションの1回のスキャンでドキュメントを更新すると思いますか?または、ドキュメントを再度検索して更新する必要がありますか? 2番目の方法は、コレクション全体を更新するために0(n^2)の複雑さが必要なので、何が起こっていないことを願っています。しかし、これに関する公式の文書はありますか? – Savvas

関連する問題