2013-10-04 4 views
7

私は以下のデータをMongoDBに持っています(私の質問に必要なものを簡略化しています)。配列の最初の要素のプロパティを検索するMongoDBクエリ

{ 
    _id: 0, 
    actions: [ 
     { 
      type: "insert", 
      data: "abc, quite possibly very very large" 
     } 
    ] 
} 
{ 
    _id: 1, 
    actions: [ 
     { 
      type: "update", 
      data: "def" 
     },{ 
      type: "delete", 
      data: "ghi" 
     } 
    ] 
} 

私が望むのは、各ドキュメントの最初のアクションタイプを見つけることです。

{_id:0, first_action_type:"insert"} 
{_id:1, first_action_type:"update"} 

(データは異なる構造ならばそれは素晴らしいですが、私は何とか、これらの値が存在する必要があります。)

編集:私はdb.collection.find({}, {'actions.action_type':1})を試してみたが、明らかにそれは、アクション列のすべての要素を返します。 。

NoSQLは全く新しいものです。以前は、これをリレーショナルデータベースの2つのテーブルにすべて格納し、SELECT id, (SELECT type FROM action WHERE document_id = d.id ORDER BY seq LIMIT 1) action_type FROM document dのようなものを作成しました。

+1

''コレクション[ .findメソッド ' –

+0

これらのドキュメントは大きいです...私は私が必要なものだけを得るのを助けるために投影や何かを使用しています。 –

+0

インデックスを追加することができます –

答えて

11

あなたは投影で$slice演算子を使用することができます。 (ただし、あなたが何をするのかは、配列を更新するときに配列の順序が同じであるかどうかは分かりません))

1

また、バージョン2.2で導入されたAggregation Pipelineを使用することができます。

db.collection.aggregate([ 
    { $unwind: '$actions' }, 
    { $group: { _id: "$_id", first_action_type: { $first: "$actions.type" } } } 
]) 
+0

それは配列全体を返すでしょう、グループの前にunwindの必要があります。次のようにします。db.collection.aggregate([{$ unwind: '$ actions'}、{$ group:{_id: "$ _id"、first_action_type:{$ first: "$ actions.type"}}}) – attish

+0

構文エラー: '{" $ actions.type "}' –

+0

@PaulDraper申し訳ありませんが、誤字がありました。修正されました、あなたは今試すことができます:) – Agis

関連する問題