2017-01-20 47 views
0

我在mongodb中很新。我只是用mongodb開始我的項目。在我的項目中,我需要從嵌套數組中獲取數據。我知道有太多的問題與此有關,但我的問題沒有解決。這裏是json。從mongodb的嵌套數組中獲取數據

{ 
    "_id": ObjectId("58805a04469d401ab45943f6"), 
    "siteId": 2, 
    "guardGender": "MALE", 
    "checkoutPoint": [{ 
     "_id": ObjectId("588098a025bad12cf01936d6"), 
     "title": "string", 
     "nfcCheckoutPoint": [{ 
      "_id": ObjectId("5880c14683d042207896f7a4"), 
      "title": "yup", 
      "intervalTime": "string", 
     }] 
    }] 

} 

我只需要nfcCheckoutPoint數組。

"nfcCheckoutPoint": [{ 
       "_id": ObjectId("5880c14683d042207896f7a4"), 
       "title": "yup", 
       "intervalTime": "string", 
      }] 

這是我的代碼,我使用

var criteria = { 
        _id: payloadData.siteId, 
        "checkoutPoint._id": payloadData.routeId, 
       "checkoutPoint.nfcCheckoutPoint._id": payloadData.checkpointId 
       }; 
var projection = { nfcCheckoutPoint: { $elemMatch: { _id: payloadData.checkpointId }}} 
var option = { 
       lean: true 
       }; 
Service.SiteService.getSite(criteria, projection, option, function (err, data) { 

    if (err) { 
     cb(err) 
    } else { 
     console.log(data)// this give me wrong values 
    } 
})  


var getSite = function (criteria, projection, options, callback) { 
    options.lean = true; 
    Models.Site.find(criteria, projection, options, callback); 
}; 

有了這個代碼我得到:

{ "_id": ObjectId("58805a04469d401ab45943f6")} 
+0

'我的問題沒有解決'太含糊聲明。你想要解決什麼問題?你面臨的問題是什麼?看看[如何問一個好問題?](http://stackoverflow.com/help/how-to-ask) – dikesh

+0

你的預期輸出是什麼? –

+0

您提到「問題未提及」,但您忘記描述「問題」。查詢的預期輸出是什麼?你用目前的查詢得到了什麼(錯誤?)?什麼是在'.getSite()'方法內? –

回答

0

您可以aggregate查詢

db.getCollection('products').aggregate([ 
    { "$match": { _id: payloadData.siteId} }, //siteId = ObjectId("58805a04469d401ab45943f6") 
    { "$project": { 
    "checkoutPoint": { 
     "$filter": { 
     "input": { 
      "$map": { 
      "input": "$checkoutPoint", 
      "as": "cPoint", 
      "in": { 
       "_id": "$$cPoint._id", 
       "nfcCheckoutPoint": { 
       "$filter": { 
        "input": "$$cPoint.nfcCheckoutPoint", 
        "as": "nfcPoint", 
        "cond": { 
        "$eq": [ '$$nfcPoint._id', payloadData.checkpointId ] //checkpointId = ObjectId("5880c14683d042207896f7a4") 
        } 
       } 
       } 
      } 
      } 
     }, 
     "as": "checkoutPoint", 
     "cond": { "$eq": [ "$$checkoutPoint._id", payloadData.routeId]}// routeId =ObjectId("588098a025bad12cf01936d6") 
     } 
    } 
    }}, 
    {$project:{nfcCheckoutPoint:{$arrayElemAt: [ "$checkoutPoint.nfcCheckoutPoint", 0 ]}, _id:0}} 
]) 

嘗試過, 輸出會是這樣的:

{ 
    "nfcCheckoutPoint" : [ 
     { 
      "_id" : ObjectId("5880c14683d042207896f7a4"), 
      "title" : "yup", 
      "intervalTime" : "string" 
     } 
    ] 
} 
+0

我只需要nfcCheckoutPoint數組。 – Karan