python - 给定 pymongo 中的开始和结束日期,过滤一个日期时间数组
问题描述
当我在 pymongo 上使用“$gte”和“$lte”过滤日期数组时遇到问题。我给你留下一段代码,以便更好地理解问题。
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)}]}]
推荐阅读
- c# - 创建 ViewModel 以组合链接的 2 个模型
- php - 在 Codeigniter 中多次上传的表单中未选择文件
- python-3.x - 如何编辑列表中的特定元素
- python - 需要为特定列设置列宽大小..同时为数据框创建表以将其转换为图像
- android - 如何在 Android SunFlower 项目的 Activity 中获取 ViewModel?
- python - 加载我的数据库页面(Flask/Heroku)时如何修复内部服务器错误?
- c# - 如何使用 p7b 和 p12 证书
- python - 使用定义python简化多个if语句
- python - Heroku 应用程序错误无法部署
- python - 如何从 .dic 文件中读取字符串列表