[解決済み] 別のフィールドの値を使って MongoDB のフィールドを更新する
質問
MongoDB では、あるフィールドの値を他のフィールドの値を使って更新することは可能ですか? 同等のSQLは以下のようなものです。
UPDATE Person SET Name = FirstName + ' ' + LastName
そして、MongoDBの疑似コードはこうなります。
db.person.update( {}, { $set : { name : firstName + ' ' + lastName } );
解決方法は?
これを行う最良の方法は、バージョン 4.2+ で、集約パイプラインを
更新
ドキュメントと
updateOne
,
updateMany
または
update
コレクションメソッドです。なお、後者はすべての言語ドライバではないにしても、ほとんどの言語で非推奨とされています。
MongoDB 4.2+
また、バージョン4.2からは
$set
のエイリアスであるパイプラインステージ演算子です。
$addFields
. 私は
$set
として、ここで
マップ
を、私たちが実現しようとしていることと同じにするのです。
db.collection.<update method>(
{},
[
{"$set": {"name": { "$concat": ["$firstName", " ", "$lastName"]}}}
]
)
メソッドの第二引数に角括弧があることに注意してください。これは、単なる更新ドキュメントではなく、集約パイプラインを定義するものです。プレーンなドキュメントを使用すると ではなく は正しく動作します。
MongoDB 3.4+
3.4+では
$addFields
と
$out
アグリゲーション・パイプライン・オペレーター
db.collection.aggregate(
[
{ "$addFields": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}},
{ "$out": "collection" }
]
)
なお、この
は、コレクションを更新するのではなく、既存のコレクションを置き換えるか、新しいコレクションを作成します。
を必要とする更新操作についても
"タイプキャスト"クライアントサイドの処理が必要です。
となり、操作によっては
find()
メソッドの代わりに
.aggreate()
メソッドを使用します。
MongoDB 3.2および3.0
その方法は
$project
を使用しています。
$concat
文字列集約演算子で連結された文字列を返します。
そこから
カーソル
を使用し
$set
を使用して、新しいフィールドをドキュメントに追加します。
一括操作
を使用することで、最大限の効率化を図ることができます。
集計クエリ。
var cursor = db.collection.aggregate([
{ "$project": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}}
])
MongoDB 3.2以降
これより
bulkWrite
メソッドを使用します。
var requests = [];
cursor.forEach(document => {
requests.push( {
'updateOne': {
'filter': { '_id': document._id },
'update': { '$set': { 'name': document.name } }
}
});
if (requests.length === 500) {
//Execute per 500 operations and re-init
db.collection.bulkWrite(requests);
requests = [];
}
});
if(requests.length > 0) {
db.collection.bulkWrite(requests);
}
MongoDB 2.6および3.0
このバージョンから、現在では非推奨となっている
Bulk
APIとその
関連メソッド
.
var bulk = db.collection.initializeUnorderedBulkOp();
var count = 0;
cursor.snapshot().forEach(function(document) {
bulk.find({ '_id': document._id }).updateOne( {
'$set': { 'name': document.name }
});
count++;
if(count%500 === 0) {
// Excecute per 500 operations and re-init
bulk.execute();
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// clean up queues
if(count > 0) {
bulk.execute();
}
MongoDB 2.4
cursor["result"].forEach(function(document) {
db.collection.update(
{ "_id": document._id },
{ "$set": { "name": document.name } }
);
})
関連
-
mongosのクラッシュ後に再起動できない問題の解決法
-
MongoDBの共通データ型と基本操作
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] pandasを使った "大量データ "ワークフロー【終了しました
-
[解決済み] MongoDBのリレーションシップ:埋め込みか参照か?
-
[解決済み] フィールドに文字列が含まれているかどうかをチェックする
-
[解決済み] 2 つの日付の間にあるオブジェクトを検索する MongoDB
-
[解決済み] ユーザー名とパスワードでMongoDBを保護する方法
-
[解決済み] MySQLとMongoDBの比較 1000回読み込み
-
[解決済み】MongoDB: 1つのフィールドですべてのドキュメントを更新する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mongodbでコネクションとログをクリアする正しい方法
-
多階層ドキュメントのMongoDBによるデータ更新方法
-
MongoDBデータベースのインストールとデプロイメント、および警告の最適化
-
[解決済み] MongoDBのリレーションシップ:埋め込みか参照か?
-
[解決済み] MongoDB コレクションのすべてのドキュメントに新しいフィールドを追加する
-
[解決済み] ロックファイルを作成/開くことができません。/data/mongod.lock errno:13 パーミッションが拒否されました。
-
[解決済み] DynamoDB vs MongoDB NoSQL【クローズド】のご案内
-
[解決済み] Mongoose のエラー Cast to ObjectId failed for value XXX at path "_id" とは何ですか?
-
[解決済み] MongoDB BSON ドキュメントサイズ制限を理解する
-
[解決済み] Mongoose を使って MongoDB ドキュメントからキーを削除する