2017-06-04 73 views
0

心中已經嘗試執行以下查詢:db.find VS db.aggregation選擇嵌套數組對象

db.getCollection('fxh').find({"username": "user1", "pf.acc.accnbr" : 915177},{userid: true, "pf.pfid": true, "pf.acc.accid":true}) 

和我的收藏如下:

{ 
    "_id" : ObjectId("5932fd8f381d4c0a7de21942"), 
    "userid" : 1496513894, 
    "username" : "user1", 
    "email" : "[email protected]", 
    "fullname" : "User 1", 
    "pf" : { 
     "acc" : [ 
      { 
       "cyc" : [ 
        { 
         "det" : { 
          "status" : "New", 
          "dcycid" : 1496513941 
         }, 
         "status" : "New", 
         "name" : "QPT202017_M1", 
         "cycid" : 1496513940 
        } 
       ], 
       "status" : "New", 
       "accnbr" : 915177, 
       "accid" : 1496513939 
      }, 
      { 
       "cyc" : [ 
        { 
         "det" : { 
          "status" : "New", 
          "dcycid" : 1496552643 
         }, 
         "status" : "New", 
         "name" : "QPT202017_S8", 
         "cycid" : 1496552642 
        } 
       ], 
       "status" : "New", 
       "accnbr" : 73497, 
       "accid" : 1496552641 
      } 
     ], 
     "pfid" : 1496513935, 
    }, 
    "lastupdate" : ISODate("2017-06-03T18:18:55.080Z"), 
    "__v" : 0 
} 

當我執行查詢結果如下:

{ 
    "_id" : ObjectId("5932fd8f381d4c0a7de21942"), 
    "userid" : 1496513894, 
    "portfolio" : { 
     "acc" : [ 
      { 
       "accid" : 1496513939 
      }, 
      { 
       "accid" : 1496552641 
      } 
     ], 
     "pfid" : 1496513935 
    } 
} 

而我的問題是,我只需要看到有關accid和結果返回th呃所有的問題!

任何想法如何才能返回accnbr選定的accid?

注:我也想在我的查詢的末尾添加$符號,它 選擇正確的ACC但它返回的所有對象或者我只需要 只有一個返回的對象。

17年6月5日

我也用來代替找到aggregate命令,並獲得通過如下結果:

db.getCollection('fxh').aggregate([ { $unwind : "$pf.acc"} , { $match : {"username":"adh1", "pf.acc.accbr": 915177 } }, {$project : {_id:0, accid: "$pf.acc.accid"}}]) 

,但不能得到一個較低的水平結果,當我跑這個:

db.getCollection('fxh').aggregate([ { $unwind : "$pf.acc.cyc"} , { $match : {"username":"adh1", "pf.acc.accbr": 915177, "pf.acc.cyc.name": "QPT202017_M1" } }, {$project : {_id:0, cycid: "$pf.acc.cyc.cycid"}}]) 

任何想法?

+0

嘗試'db.getCollection( 'FXH')骨料([{$比賽:{ 「用戶名」: 「ADH1」}},{$開卷: 「$ pf.acc」},{$匹配:{「pf.acc.accbr」:915177}},{$ unwind:「$ pf.acc.cyc」},{$ match:{「pf.acc.cyc.name」:「QPT202017_M1」}},{ $ project:{_id:0,accid:「$ pf.acc.accid」,cycid:「$ pf.acc.cyc.cycid」}}]]' – Veeram

+0

好像它似乎工作,謝謝,可以請給一個對此有點解釋? –

回答

0

您可以嘗試下面的聚合管道。

想法是$unwind一次嵌套一層,從最外層到最內層。

對於每個嵌套級別展開,您可以應用$match限制文檔並繼續,直到您具有所需的形狀。

你可以$group它在一起,以獲得回到原來的形狀。 。

db.getCollection('fxh').aggregate([ 
{ $match : {"username":"adh1"} }, 
{ $unwind : "$pf.acc"} , 
{ $match : {"pf.acc.accbr": 915177 } }, 
{ $unwind : "$pf.acc.cyc"}, 
{ $match : {"pf.acc.cyc.name": "QPT202017_M1" } }, 
{$project : {_id:0, accid: "$pf.acc.accid", cycid: "$pf.acc.cyc.cycid"}}])