web-dev-qa-db-ja.com

Mongodbは値が一意の場合にのみ挿入し、そうでない場合は更新する-node.jsで

最近アプリの開発を開始し、ついにnode.jsサーバーがmongodbデータベースと通信できるようになりました。

次のようなJSONオブジェクトをたくさん挿入したいと思います。

   {
    'Username': 'Bob',
    'longitude': '58.3',
    'latitude': '0.3'
   }

このオブジェクトがmyCollectionに挿入された後、ユーザー名Bobを使用してオブジェクトを再度挿入しようとしましたが、座標が異なる場合は、最新の 'Username': 'Bob'オブジェクトを以前のオブジェクトに置き換えます。 myCollectionには、基本的に「ユーザー名」:「ボブ」を持つオブジェクトを1つだけ含めることができます。

これがリレーショナルデータベースの場合、ボブを主キーか何かにしますが、mongoDbでこれを行うための最良の方法は何でしょうか。 update + uploadメソッドを使用する必要がありますか?私はそれを試しましたが、うまくいかなかったようです!

これがばかげた質問のように思われる場合はお詫びしますが、私はまだこれらすべてに慣れていません。

14
DeaIss

はい、updateオプションを使用した単純な upsert クエリは、ユースケースを満たす必要があります。

_db.collection.update(
   {username:"Bob"},
   {$set:{'longitude': '58.3', 'latitude': '0.3'}},
   { upsert: true}
)
_

上記のクエリを初めて実行すると(つまり、Bobがコレクションに存在しない場合)、新しいドキュメントが作成されます。ただし、lat/longの新しい値を使用して2回目に実行すると、既存のドキュメントが新しいlat/long値で更新されます。

usernameフィールドに _unique index_ を作成して、「Bob」の複数のレコードが誤って作成されるのを防ぐこともできます。

_db.collection.ensureIndex( { "username": 1 }, { unique: true } )
_

編集:

db.collection.ensureIndex()は非推奨になり、db.collection.createIndex()のエイリアスになりました。したがって、インデックスの作成には db.collection.createIndex() を使用します

25
Anand Jayabalan