Python 在pymongo中过滤给定开始和结束日期的datetime数组
当我在pymongo上使用$gte和$lte过滤一系列日期时,我遇到了一个问题。为了更好地理解这个问题,我给您留下了一段代码Python 在pymongo中过滤给定开始和结束日期的datetime数组,python,mongodb,datetime,pymongo,date-range,Python,Mongodb,Datetime,Pymongo,Date Range,当我在pymongo上使用$gte和$lte过滤一系列日期时,我遇到了一个问题。为了更好地理解这个问题,我给您留下了一段代码 import datetime from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017') db = client["AirQuality"] demo = db["demo"] demo.save({ &quo
import datetime
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017')
db = client["AirQuality"]
demo = db["demo"]
demo.save({
"devId": 1,
"samples": [
{"value":3, "datetime":datetime.datetime(2021, 3, 4, 20, 15, 22)},
{"value":6, "datetime":datetime.datetime(2021, 3, 4, 22, 35, 12)},
{"value":2, "datetime":datetime.datetime(2021, 3, 6, 10, 15, 00)}
]
})
我想过滤特定范围的值:
start = datetime.datetime(2021, 3, 4, 22, 00, 00)
end = datetime.datetime(2021, 3, 5, 2, 26, 49)
list(demo.find( { 'samples.datetime': { "$gte":start, "$lte":end } } ))
结果如下:
[{'_id': ObjectId('604353efad253df2602dfaf9'), 'devId': 1, 'samples': [{'value': 3, 'datetime': datetime.datetime(2021, 3, 4, 20, 15, 22)}, {'value': 6, 'datetime': datetime.datetime(2021, 3, 4, 22, 35, 12)}, {'value': 2, 'datetime': datetime.datetime(2021, 3, 6, 10, 15)}]}]
但我希望:
[{'_id': ObjectId('604353efad253df2602dfaf9'), 'devId': 1, 'samples': [{'value': 6, 'datetime': datetime.datetime(2021, 3, 4, 22, 35, 12)}]}]
我哪里做错了?即使我对值应用过滤器,它也不起作用,所以我相信错误在查询中!谢谢 通过聚合解决:
result = demo.aggregate([
{
"$project": {
"samples": {
"$filter": {
"input": "$samples",
"as": "item",
"cond": {
"$and":[
{ "$gte": [ "$$item.datetime", start ] },
{ "$lte": [ "$$item.datetime", end ] }
]}
}
}
}
}
])
list(result)
该报告:
[{'_id': ObjectId('604353efad253df2602dfaf9'), 'samples': [{'value': 6, 'datetime': datetime.datetime(2021, 3, 4, 22, 35, 12)}]}]
像这样使用find我认为它可以解决您的问题:
list(demo.find( { "$and":['samples.datetime':{"$gte":start}, 'samples.datetime':{"$lte":end} ] } ))