【问题标题】:Meteor Mongo update Invalid QueryMeteor Mongo 更新无效查询
【发布时间】:2014-05-09 02:25:17
【问题描述】:

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

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 函数无关。在我的程序这部分的第一次测试中,我确实确实得到了update not allowed(或其他任何东西)错误,但我修改了我的allow函数以考虑到这一点,并且错误消失了。

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

Meteor.users.allow({
    update: function (userId, doc, fields, modifier) {
        var allow = (userId && (doc._id === userId) && _.without(fields, 
                    'firstname', 'lastname', 'student_ids', 'payment_ids', 'phones').length == 0) || Meteor.user().admin;
        if (allow && modifier.$set && (_.contains(fields, 'firstname') || _.contains(fields, 'lastname'))) {
            var user = Meteor.users.findOne(userId);
            var obj = {};
            if (modifier.$set.firstname) obj.firstname = modifier.$set.firstname;
            if (modifier.$set.lastname) obj.lastname = modifier.$set.lastname;
            if (obj) Students.update({_id: {$in: user.student_ids}, reflectsUser: true}, {$set: obj});
        }
        return allow;
    }
});

【问题讨论】:

  • 这是在客户端还是服务器上?如果在客户端:是否在服务器上设置了适当的allows?另外,您是否确认id 确实是一个有效的ID?
  • 在客户端。是的,我已经打印出 id 并且它是正确的
  • 你试过用 {_id: id} 代替 id 吗?像这样:Meteor.users.update({_id: id}, {$set: {lastname: "Archer"}});
  • @stubailo 在 Meteor 中是一样的。
  • “默认情况下,允许用户使用 Accounts.createUser 指定自己的个人资料字段并使用 Meteor.users.update 对其进行修改。要允许用户编辑其他字段,请使用 Meteor.users.allow。” .你这样做了吗? id是当前用户的userId吗?

标签: mongodb meteor


【解决方案1】:

原来我的allow 函数出了问题,但有点偷偷摸摸。

Meteor.users.update 调用实际上并不是失败的那个,而是这个:

Students.update({_id: {$in: user.student_ids}, reflectsUser: true}, {$set: obj});

我没有正确检查 user.student_ids 字段,所以如果它是 undefined(该用户没有任何学生),那么查询无效。投入一行来审查该数组:

var student_ids = user.student_ids || [];

解决了问题。

由于 Meteor 错误并没有告诉我哪个查询无效,这让我有点胡思乱想。只是表明好的错误可以走很长的路!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    相关资源
    最近更新 更多