23

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 サーバーでのみ連結したい。

4

7 に答える 7

30

集計演算子$projectとを使用でき$concatます。

db.collection.aggregate([
  { $project: { newfield: { $concat: [ "$field1", " - ", "$field2" ] } } }
])
于 2016-01-21T21:24:31.923 に答える
10

残念ながら、MongoDB では現在、update() の実行時にフィールドの既存の値を参照することはできません。この機能を追加するための既存の Jira チケットがあります。詳細については、 SERVER-1765を参照してください。

現時点では、既存の値を特定するために初期クエリを実行し、クライアントで文字列操作を行う必要があります。あなたにとってより良い答えがあればいいのにと思います。

于 2012-10-10T21:48:59.210 に答える
1

@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" }
       ]
    )

MongoDB 4.2 で。. .

MongoDB 4.2 は、コレクション内のドキュメントの選択的な置換を提供する $merge パイプライン ステージを追加しますが、$out はコレクション全体を置換します。ターゲット ドキュメントを置き換える代わりに、マージするオプションもあります。

    db.collection.aggregate(
       [
          { $project: { newfield: { $concat: [ "$field1", " - ", "$field2" ] } } },
          { $merge: { into: "collection", on: "_id", whenMatched: "merge", whenNotMatched: "discard" }
       ]
    )

$out は一時的なコレクションと名前の変更を介してアトミックにコレクションの置換を実行するため、$merge と $out のどちらかを選択するときは、パフォーマンス、同時実行性、一貫性の間のトレードオフを考慮する必要があります。

https://docs.mongodb.com/manual/reference/operator/aggregation/merge/ https://docs.mongodb.com/manual/reference/operator/aggregation/merge/#merge-out-comparison

于 2019-10-10T21:35:36.083 に答える