因此,对于一部分学校练习,一部分是我自己的项目,我正在尝试制作一个 NodeRed 服务器,它返回天气数据,将其保存到 MongoDB 并在将来搜索同一位置时返回它。
我的 NodeRed 服务器正在尝试使用“node-red-contrib-mongodb4”v 2.3.0 节点完成对远程 MongoDB 数据库的 ReplaceOne() 操作。目的是检查是否存在具有三个匹配值的文档(城市、国家/地区、openweathermap_id)。如果是,请更换它。如果没有,请创建一个新文档。
问题是传递到 MongoDB 节点的对象提示“MongoInvalidArgumentError:文档必须是有效的 JavaScript 对象”错误,我不完全确定原因,尽管我认为这是因为正在执行操作,如 insertOne()有效。
节点主页:https://flows.nodered.org/node/node-red-contrib-mongodb4
该错误与连接配置无关,对同一 MongoDB 数据库的其他操作工作正常。
我已经为该对象尝试了多种不同的结构和方法。这是最新的。
这个对象(msg.payload)被传递到函数节点。
{"city":"Happy Place","country":"Over There","weather":"Clouds","tempc":14.2,"temp_maxc":15,"temp_minc":14,"humidity":84,"pressure":1023,"windspeed":2.57,"winddirection":210,"clouds":40,"description":"The weather in Happy place at coordinates: 32.2125, 75.1209 is Clouds (scattered clouds).","openweathermap_id":111,"timestamp":"2023-08-24T15:06:09.219Z"}
还尝试将对象包装在数组中,该方法适用于 insertOne() 操作,但不适用于 ReplaceOne()
这里是通向MongoDB节点的函数节点的代码:
msg.filter = {
city: {$eq: msg.payload.city},
country: {$eq: msg.payload.country},
openweathermap_id: { $eq: msg.payload.openweathermap_id }
};
msg.replacement = {
city: msg.payload.city,
country: msg.payload.country,
weather: msg.payload.weather,
tempc: msg.payload.tempc,
temp_maxc: msg.payload.temp_maxc,
temp_minc: msg.payload.temp_minc,
humidity: msg.payload.humidity,
pressure: msg.payload.pressure,
windspeed: msg.payload.windspeed,
winddirection: msg.payload.winddirection,
clouds: msg.payload.clouds,
description: msg.payload.description,
openweathermap_id: msg.payload.openweathermap_id,
timestamp: msg.payload.timestamp
};
msg.options = {
upsert: true
};
return msg;
这是 MongoDB 节点设置的图片。
我无法理解为什么这不是一个有效的 JavaScript 对象。
我没有意识到所有 CRUD 值都必须作为数组位于 msg.payload 内。我认为只需要文档的值。
这里是其他遇到此问题的人的工作代码:
msg.payload = [
{city: { $eq: msg.payload.city },
country: { $eq: msg.payload.country },
openweathermap_id: { $eq: msg.payload.openweathermap_id }},
{city: msg.payload.city,
country: msg.payload.country,
weather: msg.payload.weather,
tempc: msg.payload.tempc,
temp_maxc: msg.payload.temp_maxc,
temp_minc: msg.payload.temp_minc,
humidity: msg.payload.humidity,
pressure: msg.payload.pressure,
windspeed: msg.payload.windspeed,
winddirection: msg.payload.winddirection,
clouds: msg.payload.clouds,
description: msg.payload.description,
openweathermap_id: msg.payload.openweathermap_id,
timestamp: msg.payload.timestamp},
{upsert: true}
];
return msg;
代表提问者发表。