You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:07:01