2016-04-06 43 views
-2
{ 
    "_id":ObjectId("570404d3b4aefafb2d975e49"), 
    "timeStamp":NumberLong(1459881168860), 
    "activityMessages":null, 
    "oldLocation":null, 
    "changeType":"ContainerCreated", 
    "userId":"naveen", 
    "newLocation":"L1-500", 
    "itemHistory":[ 
     { 
     "userId":null, 
     "timeStamp":null, 
     "oldLocation":null, 
     "newLocation":null, 
     "changeType":"ItemAdded", 
     "activityMessages":null, 
     "itemNumber":325136, 
     "purchCompanyId":1003, 
     "poNum":"100", 
     "oldQty":NumberLong(0), 
     "newQty":NumberLong(100), 
     "inventoryStatus":"Received" 
     }, 
     { 
     "userId":null, 
     "timeStamp":null, 
     "oldLocation":null, 
     "newLocation":null, 
     "changeType":"ItemAdded", 
     "activityMessages":null, 
     "itemNumber":325136, 
     "purchCompanyId":1003, 
     "poNum":"100", 
     "oldQty":NumberLong(0), 
     "newQty":NumberLong(2000), 
     "inventoryStatus":"Frozen" 
     }, 
     { 
     "userId":null, 
     "timeStamp":null, 
     "oldLocation":null, 
     "newLocation":null, 
     "changeType":"ItemAdded", 
     "activityMessages":null, 
     "itemNumber":88888, 
     "purchCompanyId":1003, 
     "poNum":"101", 
     "oldQty":NumberLong(0), 
     "newQty":NumberLong(200), 
     "inventoryStatus":"Claims" 
     } 
    } 

這是我典型的Mongo文檔。在查詢給定時間戳範圍內的給定項目編號時使用以下查詢:無法正確讀取文件內的數組的mongo結果

{ "timeStamp" : { "$gte" : 0 , "$lte" : 1459933945543} , "itemHistory.itemNumber" : 325136} 

我收到了正確的答覆!然而,在搜索itemNumber 88888時,我沒有得到任何相同的查詢響應。

{ "timeStamp" : { "$gte" : 0 , "$lte" : 1459933945543} , "itemHistory.itemNumber" : 88888} 

下面的查詢工作得很好:

{ "timeStamp" : { "$gte" : 0 , "$lte" : 1459933945543} , "itemHistory" : {"$elemMatch":{"itemNumber":112}}} 

響應:

Fetched 0 records 

這使我想知道如果只有一個文檔內的數組的第一個元素被拾起同時匹配查詢條件。我嘗試了一堆其他查詢,似乎沒有任何工作。

我需要返回包含給定itemNumber的整個文檔!

TIA

+0

這是你真正的代碼有保證的錯字。再次檢查。這不是一個錯誤或類似的東西。你只需輸入一個字段名稱或集合或不正確的東西。無法重現。這裏給出的第二個查詢匹配文件就像它應該。 –

+0

{「timeStamp」:{「$ gte」:0,「$ lte」:1459933945543},「itemHistory」:{「$ elemMatch」:{「itemNumber」:112}}}此查詢有效。沒有錯字。 – Tanvi

+0

'{「timeStamp」:{「$ gte」:0,「$ lte」:1459933945543},「itemHistory.itemNumber」:88888}'完全適用於您在此問題中提供的數據。我知道是因爲我將文檔複製到一個集合中,然後運行查詢。當你需要匹配數組中的「兩個或更多條件」時,你只需要**需要'$ elemMatch'。這是它的用法,沒有別的。 –

回答

0

我已經執行兩種類型的有和無elemMatch兩者獲取正確的結果的查詢。

db.collection.find({ 
    "timeStamp" : { "$gte" : 0 , "$lte" : 1459933945543} , 
    "itemHistory.itemNumber" : 88888 
}) 

db.collection.find({ 
    "timeStamp" : { "$gte" : 0 , "$lte" : 1459933945543} , 
    "itemHistory" :{$elemMatch:{itemNumber: 88888}} 
}) 

結果(此不再贅述全文檔):

{ 
    "_id" : ObjectId("570500508eb3259244949d82"), 
    "timeStamp" : 1459881168860, 
    "activityMessages" : null, 
    "oldLocation" : null, 
    "changeType" : "ContainerCreated", 
    "userId" : "naveen", 
    "newLocation" : "L1-500", 
    "itemHistory" : [ 
     { 
      "userId" : null, 
      "timeStamp" : null, 
      "oldLocation" : null, 
      "newLocation" : null, 
      "changeType" : "ItemAdded", 
      "activityMessages" : null, 
      "itemNumber" : 88888.0, 
      "purchCompanyId" : 1003.0, 
      "poNum" : "101", 
      "oldQty" : 0, 
      "newQty" : 200, 
      "inventoryStatus" : "Claims" 
     }, 
     ... 
    ] 
}