2016-02-22 39 views
0

我有以下文件:檢索MongoDB中集合的對象陣列中的特定元件

{ 
    "_id" : 257655, 
    "name" : "Arrow", 
    "airsDayOfWeek" : "Wednesday", 
    "airsTime" : "8:00 PM", 
    "firstAired" : ISODate("2012-10-10T00:00:00.000+0000"), 
    "runtime" : 45, 
    "imdbId" : "tt2193021", 
    "seasons" : [ 
     { 
      "number" : 1, 
      "episodes" : [ 
       { 
        "_id" : 4599381, 
        "number" : 1, 
        "overview" : "Diggle and Felicity ...", 
       }, 
       { 
        "_id" : 4365918, 
        "number" : 2, 
        "overview" : "Oliver heads ...", 
       } 
      ] 
     }, 
     { 
      "number" : 2, 
      "episodes" : [ 
       { 
        "_id" : 4599398, 
        "number" : 1, 
        "overview" : "With crime in Starling Cit ...", 
       }, 
       { 
        "_id" : 4365989, 
        "number" : 2, 
        "overview" : "Oliver finds out the medicine ...", 
       } 
      ] 
     } 
    ] 
} 

以下查詢

db.shows.find({ 'seasons.episodes.number': 1, 'seasons.number': 1, _id: 257655 }) 

返回與seasons.episodes所有記錄文件

我也試過這個

db.shows.aggregate([ 
{$match: { '$and': [ {'seasons.number': 1}, { 'seasons.episodes.number': 1}, {_id: 257655}] }}, 
{$project: { 
    seasons: { 
     $filter: { 
     input: '$seasons', 
     as: 'seasons', 
     cond: {$eq: ['$$seasons.episodes.number', 1]} 
     } 
    } 
}} 
]) 

但我得到了一個錯誤:異常:無效運算符「$過濾器」

不過,我想只能用含有seasons.episodes.number = 1和seasons.number = 1

陣列獲取文檔
{ 
seasons" : [ 
     { 
      "number" : 1, 
      "episodes" : 
       { 
        "_id" : 4599381, 
        "number" : 1, 
        "overview" : "Diggle and Felicity ...", 
       } 
     } 
] 
} 

我該怎麼做?

+0

[只檢索MongoDB集合中對象數組中的查詢元素]的可能重複(http://stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an-object-array -in-mongodb-collection) – styvane

回答

1

如果限制的結果只與第一$匹配單個條目,你可以放鬆陣列並重組其對季節和情節,限制你的對手在系列和情節您感興趣的問題。

查詢

db.shows.aggregate([ 
{$match: { _id: 257655 }}, 
{$unwind: "$seasons" }, 
{$unwind: "$seasons.episodes" }, 
{$group: { _id: { series: "$seasons.number", ep: "$seasons.episodes.number" }, seasons: { $push: "$seasons" } } }, 
{$match: { "_id.series": 1, "_id.ep": 1} } 
]).pretty() 

結果

{ 
     "_id" : { 
       "series" : 1, 
       "ep" : 1 
     }, 
     "seasons" : [ 
       { 
         "number" : 1, 
         "episodes" : { 
           "_id" : 4599381, 
           "number" : 1, 
           "overview" : "Diggle and Felicity ..." 
         } 
       } 
     ] 
} 
+0

$ filter是MongoDB v3.2的新增功能,我會檢查你運行的是哪個版本。 –

+0

我升級到3.2.3之後,evrything很好。謝謝 – mike

0

它似乎只想提取節目的第一季(或每個節目)的第一集。如果是這種情況,在使用$ filter之後,您仍然需要$ unwind來標準化數組,因爲$ filter也會返回一個數組。

db.test.aggregate([ 
{$match: { '$and': [ {'seasons.number': 1}, { 'seasons.episodes.number': 1}, {_id: 257655}] }}, 
{$project: { 
    season1: { 
     $filter: { 
     input: '$seasons', 
     as: 'season', 
     cond: {$eq: ['$$season.number', 1]} 
     } 
    } 
}}, 
{$unwind : '$season1'}, 
{$project: { 
    episode1: { 
     $filter: { 
     input: '$season1.episodes', 
     as: 'episode', 
     cond: {$eq: ['$$episode.number', 1]} 
     } 
    } 
}} 
]).pretty() 

$開卷給你發作的第一個賽季的陣列,使用它可以再次使用$過濾器,只顯示(從數組)首發。

+0

謝謝你的回答。我想要檢索一個情節,而不僅僅是第一集。無論如何,我仍然有與您的查詢相同的錯誤::例外:無效的運算符'$ filter' – mike

+0

我將mongo服務器從3.0升級到3.2.3,現在它工作。 – mike

相關問題