2017-03-16 8 views
0

mongo/mongoose(バージョン3.4.0を使用)が新しく、指定された条件に一致するドキュメントJSON配列のサブセットを返すクエリを書きたいと思います。 私のドキュメントモデルにはJSONの配列が含まれています。クエリが一致する配列内のレコードと特定のフィールドのみを返すようにしたいと思います。ここでMongooseクエリーを入れ子にしたjson配列、選択したフィールドを返す

は、例スキーマです:

Var testSchema = Schema({ 
    name: { type: String }, 
    bag: { type: Array} // JSON row data, containing fields name, phone, etc... 
}); 

例データ:

name: "alpha", 
bag: [ 
    { item:"apple", color:"red", size:"small"}, 
    { item:"pear", color:"white", size:"small"}, 
    { item:"apple", color:"green", size:"large"} 
] 

name: "beta", 
bag: [ 
    { item:"apple", color:"brown", size:"small"}, 
    { item:"pear", color:"white", size:"small"}, 
    { item:"apple", color:"green", size:"medium"} 
] 

それとも

db.tests.insert({name:'alpha', bag:[{ item:'apple', color:'red', size:'small'},{ item:'pear', color:'white', size:'small'},{ item:'apple', color:'green', size:'large'}]}) 
db.tests.insert({name:'beta', bag:[{ item:'apple', color:'brown', size:'small'},{ item:'pear', color:'white', size:'small'},{ item:'apple', color:'green', size:'medium'}]}) 

私はこのデータを照会できるようにしたいが、唯一返しますクエリ項目「apple」と一致する「bag」データを返し、「bag」からの「item」と「color」フィールドのみを返します。

Name: "alpha", bag: [{ item: "apple", color: "red" }, { item: "apple", color: "green" }] 
Name: "beta", bag: [{ item: "apple", color: "brown" }, { item: "apple", color: "green" }] 

私は試合やプロジェクトで集計を使用して試してみました:

db.tests.aggregate([ 
    {"$match":{"bag.item":"apple"}}, 
    {"$project":{ 
     "Bag.item":{ 
      "$filter":{ 
      "input":"$bag", 
      "As":"bag", 
      "cond":{"$eq":["$$bag.item", "apple"]} 
     }}, 
     "Bag.color":1 
    }}]); 

しかし、これはすべての項目だけではなく、りんごの色フィールドを返し、まだサイズフィールドを返します。

Mongodb Trying to get selected fields to return from aggregate

Retrieve only the queried element in an object array in MongoDB collection

をまだネストされたJSON配列内の項目を制限する方法を考え出したていない:

私はこれらの見てきました。

+0

mongodbサーバーのバージョンは何ですか? – Veeram

+0

db.version()は3.4.0 – J21042

答えて

1

以下の集計を3.4バージョンで試すことができます。 $addFieldsは、既存のフィールドをフィルタリングされた配列で上書きし、次にを除外してsizeフィールドを削除します。

db.tests.aggregate([ 
    {"$match":{"bag.item":"apple"}}, 
    {"$addFields":{ 
     "bag":{ 
      "$filter":{ 
      "input":"$bag", 
      "as":"result", 
      "cond":{"$eq":["$$result.item", "apple"]} 
     }} 
    }}, 
    {"$project":{"bag.size":0}} 
]); 
+0

素晴らしいです、ありがとうございます! – J21042

関連する問題