2013-12-11 5 views
6

中にアレイにエントリを追加することが可能である:

{ 
    _id : ObjectId(.....), 
    prop1 : "foo", 
    links : [ 1, 2, 3, 4 ] 
} 

{ 
    _id : ObjectId(.....), 
    prop1 : "bar", 
    links : [ 5, 6, 7, 8 ] 
} 

私はこれらの文書を処理するために集約フレームワークを使用しています、私が使う$生成にくつろぎますリンク配列内の各値のドキュメント。

$ unwindを呼び出す前にドキュメントを更新する必要がある3つのケースがありますが、私は$ project操作を見ていましたが、以下のケースでは配列の作成方法や更新方法に関する情報はありません。

1)リンクプロパティがリンクの配列プロパティは、私が挿入する必要が空の配列

{ 
    _id : ObjectId(.....), 
    prop1 : "far", 
    links : [] 
} 

ある)私はリンクアレイ

2を挿入する必要が

{ 
    _id : ObjectId(.....), 
    prop1 : "far" 
} 

が欠落しています配列の値

3)リンク配列の値が少なすぎる

{ 
    _id : ObjectId(.....), 
    prop1 : "far", 
    links : [ 9, 10 ] 
} 

は、私はあなたが使用することができるはず

+1

条件付きで値を追加するには '$ cond'を参照してください:http://docs.mongodb.org/manual/reference/operator/aggregation/cond/ – WiredPrairie

+0

私は$ condに慣れています、問題私は実際に配列を作成する方法や配列の値を更新する方法を理解できないということがあります。私はこれをより良く反映するように質問を更新しました。 – user2808819

+0

文書を実際に永続的に変更することはできません。フィールドの値を変更できるのはパイプライン中のみです。 – WiredPrairie

答えて

2

配列に追加の値を挿入する必要があり$isNullreference):

db.test.aggregate({ $project : { the_links: { $ifNull : ["$links" , [5,6]]}} }) 

それは単純な論理だ参照フィールド($links)がある場合にnullの場合、置換値(この場合は[5, 6])が使用されます。この例ではフィールドをthe_linksに変更しました。

linksフィールドがnull(空の配列ではない)と仮定します。

db.test.aggregate({ $project : 
    { the_links: { $cond : [ { $eq : ["$links", []]}, '$links', [5,6]]}} }) 

しかし、もし:リンクはnullではなく空の配列[]だったら、あなたのような何かができる

{ 
    "result" : [ 
      { 
        "_id" : ObjectId("52a869d51d02442354276cff"), 
        "the_links" : [ 
          1, 
          2, 
          3, 
          4 
        ] 
      }, 
      { 
        "_id" : ObjectId("52a869e31d02442354276d00"), 
        "the_links" : [ 
          5, 
          6 
        ] 
      } 
    ], 
    "ok" : 1 
} 

:与えられたデータのように:

{ "_id" : ObjectId(...), "prop1" : "foo", "links" : [ 1, 2, 3, 4 ] } 
{ "_id" : ObjectId(...), "prop1" : "bar" } 

集約が上記の生成しますそれはnullまたは[]のいずれかであるため、01内の$orとしてその条件の追加チェックを追加する必要がありますオペレータ。

リストに値があり、さらに条件付きで値を追加したい場合は、現在の(2.4.x)本番のMongoDBプロダクションビルドには有効な解決策がありません。開発ブランチには$sizeという演算子があり、配列の長さ(jira)を返します。その後、条件付きでさらに別の開発機能を使用してそれらを追加することができます$ setUnionと呼ば:

$ setUnion は配列の任意の数をとり、 は、任意の入力配列に表示される要素を含むという配列を返します。

+0

ケース1と2で動作するように見えますが、既存の配列に値を追加する必要があるケース3について考えてください。私はmongo 2.6の変更を見てきましたが、配列の各エントリに適用できる$ map関数がありますが、配列に値を挿入できるようには見えません。 – user2808819

+0

2.6で新しい集合演算子を実際に見たとき、$ setUnionは任意の数の配列をとり、それらの和集合を生成します。 $ projectを使用して新しい値を新しい配列のプロパティに追加し、$ setUnionをマージするか、値の1つとしてリテラル配列を使用することもできます。 2.6をダウンロードして試してみる必要があります。 – user2808819

+0

あなたは何をしようとしているのか説明できますか?なぜ配列に値を追加しようとしていますか?私は将来のバージョンサポートについていくつかの詳細を追加しました。 – WiredPrairie

関連する問題