我正在开发一个在我的 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);
}
}
我找到了解决办法。
我发布的内容(示例 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;
}