2つの文字列フィールドの値を連結して3番目の文字列フィールドに入れるにはどうすればよいですか?
私はこれを試しました:
db.collection.update(
{ "_id": { $exists: true } },
{ $set: { column_2: { $add: ['$column_4', '$column_3'] } } },
false, true
)
ただし、これは機能していないようで、not ok for storage
をスローします。
私もこれを試しました:
db.collection.update(
{ "_id": { $exists : true } },
{ $set: { column_2: { $add: ['a', 'b'] } } },
false, true
)
しかし、これでも同じエラーnot ok for storage
が表示されます。
アプリケーションではなく、mongoサーバーでのみ連結したい。
残念ながら、MongoDBでは現在、update()を実行するときにフィールドの既存の値を参照することはできません。この機能を追加するための既存のJiraチケットがあります。詳細については、 SERVER-1765 を参照してください。
現在、既存の値を判別するために初期クエリを実行し、クライアントで文字列操作を実行する必要があります。もっと良い答えがあればいいのにと思います。
集計、$ project、$ concatを使用できます: https://docs.mongodb.org/v3.0/reference/operator/aggregation/project/https:// docs。 mongodb.org/manual/reference/operator/aggregation/concat/
それはこのようなものになります:
db.collection.aggregate(
[
{ $project: { newfield: { $concat: [ "$field1", " - ", "$field2" ] } } }
]
)
このようなデータがあるコレクション名が「myData」であるとします。
{
"_id":"xvradt5gtg",
"first_name":"nizam",
"last_name":"khan",
"address":"H-148, Near Hero Show Room, Shahjahanpur",
}
フィールドを連結し(first_name + last_name + address)、次のように「address」フィールドに保存します。
{
"_id":"xvradt5gtg",
"first_name":"nizam",
"last_name":"khan",
"address":"nizam khan,H-148, Near Hero Show Room, Shahjahanpur",
}
今、クエリを書くことは
{
var x=db.myData.find({_id:"xvradt5gtg"});
x.forEach(function(d)
{
var first_name=d.first_name;
var last_name=d.last_name;
var _add=d.address;
var fullAddress=first_name+","+last_name+","+_add;
//you can print also
print(fullAddress);
//update
db.myData.update({_id:d._id},{$set:{address:fullAddress}});
})
}
@ Jambyによって提案された、@ rebe100xからの回答に基づいて構築...
集約パイプラインでは、$ project、$ concat、および$ out(または$ merge)を使用できます。 https://docs.mongodb.org/v3.0/reference/operator/aggregation/project/https://docs.mongodb.org/manual/reference/operator/aggregation/concat /https://docs.mongodb.com/manual/reference/operator/aggregation/out/
例えば:
db.collection.aggregate(
[
{ $project: { newfield: { $concat: [ "$field1", " - ", "$field2" ] } } },
{ $out: "collection" }
]
)
MongoDB4.2を使用。 。 。
MongoDB 4.2は、コレクション内でドキュメントの選択的置換を提供する$ mergeパイプラインステージを追加しますが、$ outはコレクション全体を置換します。ターゲットドキュメントを置き換える代わりに、マージするオプションもあります。
db.collection.aggregate(
[
{ $project: { newfield: { $concat: [ "$field1", " - ", "$field2" ] } } },
{ $merge: { into: "collection", on: "_id", whenMatched: "merge", whenNotMatched: "discard" }
]
)
$ mergeと$ outのどちらかを選択するときは、パフォーマンス、並行性、一貫性の間のトレードオフを考慮する必要があります。$ outは原子的にコレクションの置換を実行するためです一時的なコレクションと名前の変更を介して。
https://docs.mongodb.com/manual/reference/operator/aggregation/merge/https://docs.mongodb.com/manual/reference/operator/aggregation/merge /#merge-out-comparison
db.collection.update( {"_id" :{"$exists":true}},[{"$set":{"column_2":{"$concat":["$column_4","$column_3"]}}}]
私の場合、これは$concat
私のために働いた.。
以下に従うこともできます。
db.collectionName.find({}).forEach(function(row) {
row.newField = row.field1 + "-" + row.field2
db.collectionName.save(row);
});