Nodejs MongoClient 返回与 MongoDB Compass 不同的结果

问题描述 投票:0回答:1

我正在开发一个在我的 mongo 数据库上运行聚合管道的 Nodejs 后端。由于某种原因,当从我的 Nodejs 应用程序运行此管道时,它返回 0 个结果。然而,当我直接从 MongoDB Compass 运行管道时,我得到了我期望的许多结果。

我能够从 Nodejs 应用程序成功运行其他聚合管道,因此我确信我的连接已正确设置,并且集合是正确的。

我想我已经将范围缩小到了主要问题的日期。有人知道我如何从 Nodejs 应用程序运行它吗?

管道:

[
        {
          $match: {
            StartDate: {
              $gte: new Date("2023-09-20T00:00:00.000Z"),
              $lt: new Date("2023-09-23T00:00:00.000Z")
            }
          }
        }
      ]

这是整个端点供参考:

async function startServer() {
  try {
    const client = new MongoClient(MONGODB_URI, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });

    await client.connect();
    console.log('Connected to MongoDB');

    const db = client.db(); // Specify your database name if not the default

    app.post('/query', async (req, res) => {
      const testQuery = [
        {
          $match: {
            StartDate: {
              $gte: new Date("2023-09-20T00:00:00.000Z"),
              $lt: new Date("2023-09-23T00:00:00.000Z")
            }
          }
        }
      ]
      try {
        console.log("Received a request: ", JSON.stringify(req.body));
    
        const { collection, query } = req.body;
    
        if (!collection || !query) {
          return res.status(400).json({ error: "Collection or Query is missing" });
        }
    
        const result = await db.collection('Rides').aggregate(testQuery).toArray();
        console.log(result);
        res.json(result);
      } catch (err) {
        res.status(500).json({ error: err.message });
      }
    });    

    app.listen(5003, () => {
      console.log('Server started on http://localhost:5003');
    });
  } catch (error) {
    console.error('Error connecting to MongoDB:', error);
  }
}
node.js mongodb aggregation-framework
1个回答
0
投票

我找到了解决办法。

我发布的内容(示例 json)实际上有效,只是我从未运行过它。然而,当管道从前端传入时,json被序列化,然后在后端反序列化。在此过程中,日期变成了字符串。

我为解决此问题所做的是将所有日期转换为 ISO 格式字符串,然后在运行管道之前使用函数将 ISO 格式字符串转换回日期。

function convertISOStringsToDate(obj) {
  if (Array.isArray(obj)) {
      return obj.map(item => convertISOStringsToDate(item));
  } else if (typeof obj === 'object' && obj !== null) {
      const newObj = {};
      for (let key in obj) {
          if (obj.hasOwnProperty(key)) {
              if (isISODateString(obj[key])) {
                  newObj[key] = new Date(obj[key]);
              } else {
                  newObj[key] = convertISOStringsToDate(obj[key]);
              }
          }
      }
      return newObj;
  }
  return obj;
}
© www.soinside.com 2019 - 2024. All rights reserved.