Javascript Node.js MongoDB更新文档需要对象,获取数组
我正在使用mongodb和node.js构建我的第一个应用程序,我遇到了一堵砖墙。当我尝试.update()或.updateMany()时,我的服务器会返回:Javascript Node.js MongoDB更新文档需要对象,获取数组,javascript,arrays,node.js,mongodb,express,Javascript,Arrays,Node.js,Mongodb,Express,我正在使用mongodb和node.js构建我的第一个应用程序,我遇到了一堵砖墙。当我尝试.update()或.updateMany()时,我的服务器会返回: UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): MongoError: Wrong type for 'q'. Expected a object, got a array. 现在的问题是,我的代码以前工作过,我已经成功地将
UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): MongoError: Wrong type for 'q'. Expected a object, got a array.
现在的问题是,我的代码以前工作过,我已经成功地将大约150个对象的数组插入到我的数据库中。(当我第一次这样做时,我使用了.insert()而不是.update(),但现在两者都不起作用。)
下面是我用来先存储对象数组,然后存储数据库中的.update()的确切代码
存储阵列(我正在为此使用外部API):
发送到my router.js进行处理:
$('#sendupdate').click(function(){
var jsonstring = JSON.stringify(all);
console.log(jsonstring);
$.ajax({
type: "POST",
dataType: "JSON",
contentType: "application/json",
data: jsonstring,
url: "/s",
success: function(response) {
console.log('Successfully Updated');
}
});
});
});
最后,我的router.js对接收到的数据做了如下处理:
router.post('/s', function(req, res){
var MongoClient = mongodb.MongoClient;
var url = 'mongodb://localhost:27017/someDB';
MongoClient.connect(url, function(err, db){
if(err){
console.log('unable to connect to the server', err);
} else {
console.log('connected');
var collection = db.collection('someCollection');
var data = req.body;
console.log('data collected');
console.log(data);
collection.updateMany(data, data, {upsert:true});
}
});
});
现在我知道我可以在数组中循环并对每个对象发出请求,但这感觉我将使用太多的资源,尤其是知道我以后需要为大多数进入我的站点的用户提供类似的功能
我还能做些什么用这么多新对象更新数据库?我知道mongodb希望接收一个对象,但我不明白为什么它以前工作,因为接收的数据总是一个对象数组
提前谢谢你,我希望有人能帮我解释一下
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
编辑:我已经想出了一个临时解决方案,我仍然不确定它有多好,但是如果有人对如何改进它有任何想法,请务必让我知道
以下是我为有类似问题的人所做的修改:
我没有尝试用数组更新数组,而是使用for循环遍历数组[I],并分别更新每个对象。它发生在服务器端,可能不是最好的解决方案,但目前它仍然有效
以下是更改后的代码:
router.post('/s', function(req, res){
var MongoClient = mongodb.MongoClient;
var url = 'mongodb://localhost:27017/someDB';
MongoClient.connect(url, function(err, db){
if(err){
console.log('unable to connect to the server', err);
} else {
console.log('connected');
var collection = db.collection('someCollection');
var data = req.body;
console.log('data collected');
var i;
for(i = 0; i <= data.length; ++i){
collection.update(data[i], {$set:data[i]}, {upsert:true});
}
}
});
});
router.post('/s',函数(req,res){
var MongoClient=mongodb.MongoClient;
var url='1〕mongodb://localhost:27017/someDB';
连接(url,函数(err,db){
如果(错误){
console.log('无法连接到服务器',错误);
}否则{
console.log('connected');
var collection=db.collection('someCollection');
var数据=请求主体;
console.log(“收集的数据”);
var i;
对于(i=0;i data是一个字符串(我相信)a d,您需要一个对象。因此,may do data=JSON.parse(data);在服务器端…刚刚尝试了一下,我得到了一个错误“位置1处JSON中的意外标记o”我猜数据接收的格式可能是错误的?数据看起来像[{“name”:“thename”},{“anothername”:“anothername”}]此错误表示您正在尝试解析已经是JS对象的内容。MongoDB无论如何都支持对文档数组进行大容量插入/更新,而这些数据似乎是,您可以调用updateMany,它对数组有效。您的实际问题是什么?谢谢Martin,我正在尝试找出问题的真正原因。启动wi时,它起到了作用但是现在我得到了上面提到的未处理的promise错误…问题是updateMany
的第一个参数应该是定义条件的对象
router.post('/s', function(req, res){
var MongoClient = mongodb.MongoClient;
var url = 'mongodb://localhost:27017/someDB';
MongoClient.connect(url, function(err, db){
if(err){
console.log('unable to connect to the server', err);
} else {
console.log('connected');
var collection = db.collection('someCollection');
var data = req.body;
console.log('data collected');
var i;
for(i = 0; i <= data.length; ++i){
collection.update(data[i], {$set:data[i]}, {upsert:true});
}
}
});
});