我在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翻译相同的查询。有人可以帮助我。答案 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()