Mongodb Meteor Mongo更新无效查询

Mongodb Meteor Mongo更新无效查询,mongodb,meteor,Mongodb,Meteor,为什么这次更新失败了?这是基本的,我已经做过很多次了 Meteor.users.update(id,{$set:{lastname:“Archer”}); 上面的查询甚至比最初的查询简化了,但仍然存在相同的问题。最初我是按程序编译更新的: console.log(obj); console.log(id); if(obj)collection.update(id,obj); 以下是这些行的确切输出: Object {$set: Object} $set: Object

为什么这次更新失败了?这是基本的,我已经做过很多次了

Meteor.users.update(id,{$set:{lastname:“Archer”});
上面的查询甚至比最初的查询简化了,但仍然存在相同的问题。最初我是按程序编译更新的:

console.log(obj);
console.log(id);
if(obj)collection.update(id,obj);
以下是这些行的确切输出:

Object {$set: Object}
    $set: Object
        lastname: "Archer"
        __proto__: Object
        __proto__: Object
main.js?b9104f881abb80f93da518738bf1bfb4cab0b2b6:68

YXeudfnHyKmsGXaEL
main.js?b9104f881abb80f93da518738bf1bfb4cab0b2b6:69

update failed: MongoError: invalid query
debug.js:41
id
是正确的,如果
obj
有问题,那对我来说就是新闻

现在,我非常肯定这与我的
allow
函数无关。在我的程序的这一部分的第一次测试中,我确实得到了
不允许更新
(或不管是什么)错误,但我修改了
允许
函数以考虑到这一点,错误消失了

这是我的
allow
函数。我有一个用户系统,用户可以有一个学生对象“镜像”它的名称信息,因此增加了复杂性。该部分功能仅在某些情况下使用,并且不会改变津贴的行为

Meteor.users.allow({
更新:函数(用户ID、文档、字段、修改器){
var allow=(userId&&(doc.\u id==userId)&&&&(不带字段,
'firstname','lastname','student_id','payment_id','phones')。长度==0)| | Meteor.user().admin;
if(allow&&modifier.$set&(_.contains(字段,'firstname')| | _.contains(字段,'lastname')){
var user=Meteor.users.findOne(userId);
var obj={};
如果(修饰符$set.firstname)obj.firstname=修饰符$set.firstname;
如果(修饰符$set.lastname)obj.lastname=修饰符$set.lastname;
if(obj)Students.update({u id:{$in:user.student_id},reflectsUser:true},{$set:obj});
}
允许返回;
}
});

原来是我的
允许
功能出了问题,但有点狡猾

Meteor.users.update的
调用实际上并不是失败的调用,而是以下调用:

Students.update({u-id:{$in:user.student-id},reflectsUser:true},{$set:obj});
我没有正确检查
user.student\u id
字段,因此如果它是
未定义的
(该用户没有任何学生),则查询无效。排成一行检查该阵列:

var student_id=user.student_id | |[];
解决了这个问题

由于流星错误没有告诉我哪个查询是无效的,这让我陷入了一场白费力气的追逐。这表明,好的错误可以走很长的路


此外,执行具有其他数据库查询作为副作用的数据库查询时要非常小心。

这是在客户端还是服务器上执行的?如果在客户端:是否在服务器上设置了适当的
allow
s?另外,您是否验证了
id
确实是一个有效的id?它在客户端上。是的,我已经打印出了
id
,它是正确的。你试过用{u id:id}代替id吗?像这样:
Meteor.users.update({u id:id},{$set:{lastname:'Archer}})@stubailo,这与Meteor中的相同。“默认情况下,允许用户使用Accounts.createUser指定自己的配置文件字段,并使用Meteor.Users.update对其进行修改。要允许用户编辑其他字段,请使用Meteor.Users.allow。”。你做到了吗?
id
是当前用户的用户id吗?