只获取mongodb

时间:2016-08-10 09:33:15

标签: mongodb mongodb-query pymongo

我在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-07-24的字段。我想只获得指定日期之间的结果。我是mongo的新手。我如何得到预期的结果?

MongoDB shell版本:2.4.9

修改

Prabhu和Ihor提供的解决方案适用于mongodb客户端,但我无法为pymongo翻译相同的查询。有人可以帮助我。

3 个答案:

答案 0 :(得分: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')]}
                       ]
                   }
                }
             }
          }
       }
    ])

答案 1 :(得分:0)

我已经回答了有关使用日期范围搜索数组的相同问题。 看MongoDb searching nested array between dateTimes using Robomongo

如果它不适合您,我会向您显示查询数据。

答案 2 :(得分:-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()