2017-09-28 14 views
0

私は要素のサブコレクションを持っています。このコレクションの最初のアイテムの特定のサブフィールドを投影したいと思います。私は以下を持っていますが、配列内のすべての要素のフィールドしか投影しません。Mongo集約、配列内の最初の要素のサブフィールドを投影

ItemsはOrdersのサブコレクションであり、各ItemオブジェクトにはDetailsサブオブジェクトとその下にItemNameがあります。リスト内の最初の項目の項目名のみを返したいとします。これは、リスト内の各項目の項目名を返します。

どうすれば調整できますか?

db.getCollection('Orders').aggregate 
([ 
{ $match : { "Instructions.1" : { $exists : true }}}, 
{ $project: { 
    _id:0, 
    'UserId': '$User.EntityId', 
    'ItemName': '$Items.Details.ItemName' 
    } 
} 
]); 

更新日:あなたは、少なくとものMongoDB V3.2を使用している場合は

{ 
    "_id" : "order-666156", 
    "State" : "ValidationFailed", 
    "LastUpdated" : { 
     "DateTime" : ISODate("2017-09-26T08:54:16.241Z"), 
     "Ticks" : NumberLong(636420128562417375) 
    }, 
    "SourceOrderId" : "666156", 
    "User" : { 
     "EntityId" : NumberLong(34450), 
     "Name" : "Bill Baker", 
     "Country" : "United States", 
     "Region" : "North America", 
     "CountryISOCode" : "US", 
    }, 
    "Region" : null, 
    "Currency" : null, 
    "Items" : [ 
     { 
      "ClientOrderId" : "18740113", 
      "OrigClientOrderId" : "18740113", 
      "Quantity" : NumberDecimal("7487.0"), 
      "TransactDateTime" : { 
       "DateTime" : Date(-62135596800000), 
       "Ticks" : NumberLong(0) 
      }, 
      "Text" : null, 
      "LocateRequired" : false, 
      "Details" : { 
       "ItemName" : "Test Item 1", 
       "ItemCost" : 1495.20 
      } 
     }, 
     { 
      "ClientOrderId" : "18740116", 
      "OrigClientOrderId" : "18740116", 
      "Quantity" : NumberDecimal("241.0"), 
      "TransactDateTime" : { 
       "DateTime" : Date(-62135596800000), 
       "Ticks" : NumberLong(0) 
      }, 
      "Text" : null, 
      "LocateRequired" : false, 
      "Details" : { 
       "ItemName" : "Test Item 2", 
       "ItemCost" : 2152.64 
      } 
     } 
    ] 

} 
+0

てみ '{ 'ItemNameの':{$のarrayElemAt:[ '$ Items.Details.ItemName'、0]}}' [あなたはMongoDBの投影集合内の特定の配列の項目にアクセスするにはどうすればよいの – Veeram

+0

可能な重複? ](https://stackoverflow.com/questions/30997736/how-do-you-access-a-specific-array-item-in-mongodb-projection-aggregation) – Veeram

答えて

1

あなたはそのため$arrayElemAt演算子を使用することができます。以下のクエリは、あなたが望むことを実行します。ただし、"Instructions.1": { $exists: true }フィルタがサンプルドキュメントを削除するため、指定したサンプルのデータは返されません。

db.getCollection('Orders').aggregate([{ 
    $match: { 
     "Instructions.1": { 
      $exists: true 
     } 
    } 
}, { 
    $project: { 
     "_id": 0, 
     "UserId": "$User.EntityId", 
     "ItemName": { $arrayElemAt: [ "$Items.Details.ItemName", 0 /* first item! */] } 
    } 
}]) 
+0

これは完璧です、ありがとう。試合の質問は実際にItems.1、apologiesであることを意味していました。 – NZJames

関連する問題