Node调用Python操作MongoDB日期查询返回空数组问题
MongoDB日期查询返回空数组的解决方案
问题根源
你当前的代码逻辑存在类型不匹配问题:
- Node.js端用
moment(date).valueOf()把ISO日期转成了毫秒级整数时间戳 - MongoDB中存储的
date字段是ISODate(或Pythondatetime)类型 - 直接用整数和日期类型比较,MongoDB无法识别匹配规则,因此返回空数组
修复方案
1. 修改Node.js端(index.js)
无需转换时间戳,直接传递原始ISO日期字符串给Python脚本:
const { spawn } = require('child_process'); exports.searchData = async (req, res, next) => { const { date } = req.query; console.log("Récupération de l'argument de la requête"); try { const pythonFilePath = './test.py'; // 直接传递原始ISO日期字符串,跳过时间戳转换 const pythonProcess = spawn('python', [pythonFilePath, '--date', date]); let results = ''; pythonProcess.stdout.on('data', (data) => { results += data.toString(); }); pythonProcess.stderr.on('data', (data) => { console.error(`Erreur de sortie : ${data}`); res.status(500).json({ error: "Erreur lors de l'exécution du fichier Python" }); }); pythonProcess.stdout.on('end', () => { console.log("Pas d'erreur Python"); console.log("Résultats : ", results); res.status(200).json({ results }); }); pythonProcess.on('close', (code) => { if (code !== 0) { console.error(`Une erreur s'est produite : ${code}`); res.status(500).json({ error: "Erreur lors de l'exécution du fichier Python" }); } }); } catch (error) { console.log('Erreur lors de la recherche dans la base de données :', error); res.status(500).json({ error: 'Erreur lors de la recherche dans la base de données' }); } };
2. 修改Python端(test.py)
接收ISO日期字符串,转换为Pythondatetime对象,再构建MongoDB可识别的查询条件,同时处理序列化问题:
import argparse from pymongo import MongoClient import json from datetime import datetime # 调整参数接收,改为date字符串 parser = argparse.ArgumentParser() parser.add_argument('--date', type=str, help='La date ISO spécifiée dans la requête') args = parser.parse_args() # 转换ISO字符串为datetime对象(兼容Z后缀的格式) target_date = datetime.fromisoformat(args.date.replace('Z', '+00:00')) # MongoDB连接逻辑不变 client = MongoClient('mongodb+srv://pierre:ztxiGZypi6BGDMSY@atlascluster.sbpp5xm.mongodb.net/?retryWrites=true&w=majority') db = client.test collection = db.testDate # 使用datetime对象构建查询,MongoDB自动匹配ISODate类型 query = {'date': {'$lt': target_date}} documents = collection.find(query) # 处理MongoDB特殊类型的序列化问题 json_data = [] for doc in documents: # 将ObjectId转为字符串 doc['_id'] = str(doc['_id']) # 将日期转为ISO字符串格式 if 'date' in doc: doc['date'] = doc['date'].isoformat() json_data.append(doc) response_data = json.dumps(json_data) print(response_data)
3. 验证数据存储格式
确保MongoDB中date字段的存储类型是ISODate,而非字符串。如果是字符串格式,需要保证查询时的字符串格式与存储完全一致(推荐优先使用日期类型存储日期数据)。
内容的提问来源于stack exchange,提问作者Pierre Bénard
相关产品推荐
相关产品推荐

