NodeRed 使用 Javascript 对象进行 MongoDB 操作

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

因此,对于一部分学校练习,一部分是我自己的项目,我正在尝试制作一个 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 对象。

javascript json mongodb javascript-objects node-red
1个回答
0
投票

我没有意识到所有 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;

代表提问者发表。

© www.soinside.com 2019 - 2024. All rights reserved.