2016-08-10 31 views
0

領域,我按照我的MongoDB託收:獲得搜索只在MongoDB中

 { 
     "_id": ObjectId("579493bccdba841a0bf5ad1a"), 
     "uniqueId": "bUbOaciS1g", 
     "chat": [ 
     { 
      "TS": ISODate("2016-07-24T10:09:00.631Z"), 
      "user_ques": "hi", 
      "rep_ans": "hello" 
     }, 
     { 
      "TS": ISODate("2016-08-01T10:09:40.814Z"), 
      "user_ques": "how are you?", 
      "rep_ans": "i am fine" 
     }, 
     { 
      "TS": ISODate("2016-08-04T10:09:55.724Z"), 
      "user_ques": "help me", 
      "rep_ans": "sure" 
     } 
] 
    } 
    { 
     "_id": ObjectId("579493bccdba841a0bf5ad1b"), 
     "uniqueId": "xyzOaciS1g", 
     "chat": [ 
     { 
      "TS": ISODate("2016-08-09T10:09:00.631Z"), 
      "user_ques": "hi", 
      "rep_ans": "hello" 
     } 
] 
    } 

我想做的事就是讓只與特定的日期字段和排除他人。 查詢我想:

db.collection.find({'chat.TS':{$gte:ISODate("2016-08-01T00:00:00.000Z"),$lte:ISODate("2016-08-10T00:00:00.000Z")}}).pretty() 

結果我預計:

{ 
     "TS": ISODate("2016-08-01T10:09:40.814Z"), 
     "user_ques": "how are you?", 
     "rep_ans": "i am fine" 
    }, 
    { 
     "TS": ISODate("2016-08-04T10:09:55.724Z"), 
     "user_ques": "help me", 
     "rep_ans": "sure" 
    } 
    { 
     "TS": ISODate("2016-08-09T10:09:00.631Z"), 
     "user_ques": "hi", 
     "rep_ans": "hello" 
    } 

,而不是我得到預期的結果加上日期2016年7月24日的現場。我想只在指定的日期之間得到結果。我是mongo的新手。我如何得到預期的結果?

MongoDB的外殼版本:通過帕布和伊霍爾提供2.4.9

編輯

解決方案做工精細MongoDB的客戶端,但我不能爲pymongo翻譯相同的查詢。有人可以幫我解決這個問題嗎?

回答

-2
db.collection.find({ 
    'chat.TS':{ 
     $gte:ISODate("2016-08-01T00:00:00.000Z"), 
     $lte:ISODate("2016-08-10T00:00:00.000Z") 
    } 
}, 
{'chat.TS':1}) 
.pretty() 
+2

正常投影在這裏不起作用。這將仍然顯示聊天數組中的第一個文檔的07-24聊天對象。 –

0

我已經回答了有關在日期範圍內搜索數組的問題。 看看MongoDb searching nested array between dateTimes using Robomongo

如果它不適合你,我會告訴你一個查詢你的數據。

+0

嗨@Ihor,我想知道你是否通過在pymongo中告訴相同的查詢來幫助我,我在那裏嘗試過,但拋出錯誤。 –

+0

嗨,抱歉,但我沒有任何pymongo的經驗。 (src/mongo/shell/utils.js:37:15) at DBCollection.aggregate(src/mongo/shell/collection.js: –

1

使用如下所示的聚合查詢。將查詢編輯爲所需的輸出。

db.collection.aggregate([ 
     { 
      $match:{ 
      chat: { 
       $elemMatch: 
       {TS: 
        { 
         $gt: ISODate('2016-08-01T00:00:00.000Z'), 
         $lt: ISODate('2016-08-10T00:00:00.000Z') 
        } 
       } 
       } 
      } 
     }, 
     { 
      $project: { 
      _id:1,    
      chat: { 
       $filter: { 
        input: "$chat", 
        as: "item", 
        cond: { 
         $and: [ 
          {$gt: [ "$$item.TS", ISODate('2016-08-01T00:00:00.000Z') ]}, 
          {$lt: ["$$item.TS", ISODate('2016-08-10T00:00:00.000Z')]} 
         ] 
        } 
       } 
      } 
      } 
     } 
    ]) 
+0

)嗨@Prabhu我得到: 錯誤:打印堆棧跟蹤 at printStackTrace 897:9) 在(殼):1:12 星期三16年8月10日:48:20.377骨料失敗:{ \t 「ERRMSG」: 「異常:無效操作者 '$濾波器'」, \t 「代碼」:15999 , \t「ok」:0 } at src/mongo/shell/collection.js:898' 我覺得它是由於我使用的mongo版本,有什麼建議嗎? –

+0

嗨Prashant,你是對的。從3.2版本開始,您可以使用新的$ filter聚合運算符在投影期間過濾數組,這有利於包含所有匹配,而不僅僅是第一個匹配。請參考下面的URL。 http://stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an-object-array-in-mongodb-collection – Prabhu

+0

嘿@Prabhu,一個更多的幫助,它現在工作正常在我更新後的mongo中,但是我無法使用pymongo運行查詢,請問您可以爲pymongo寫出查詢,這會有很大的幫助。 –