因此,作为学校练习的一部分,我自己的项目的一部分,我试图制作一个NodeRed服务器,它返回天气数据,将其保存到MongoDB,并在将来搜索同一位置时返回。
我的NodeRed服务器正在尝试使用“node-red-contrib-mongodb 4”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"}
还尝试将对象 Package 在数组中,该方法适用于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对象。
1条答案
按热度按时间jtjikinw1#
我没有意识到所有的CRUD值都必须以数组的形式存在于msg.payload中。我认为只有文档的值需要。
以下是其他遇到此问题的人的工作代码: