什么是 MongoDB 修饰符和运算符?

Posted

技术标签:

【中文标题】什么是 MongoDB 修饰符和运算符?【英文标题】:What are MongoDB Modifiers and Operators? 【发布时间】:2015-04-11 14:09:55 【问题描述】:

我正在开发 Meteor 应用程序,我正在构建的功能之一是将新文档插入数组的表单(将送货地址插入到用户的个人资料中,其中用户可以有多个地址)。我不断收到的错误是:

Exception while invoking method 'addAddress' Error: When the modifier option is true, validation object must have at least one operator

我一直试图在 ***、Github 等上找出答案但没有找到解决方案。我现在想采取确切理解错误含义的方法 - 所以我的问题是 MongoDB 中的修饰符选项和运算符到底是什么?据我了解,修饰符对查询返回的数据类型提供了约束,运算符用于修改数据。这些定义正确吗?

有谁知道我遇到的错误可能意味着什么?这是我的示例代码:

我的点击事件捕获表单上的数据并调用方法添加地址:

Template.editAddress.events(

'click .addAddress': function(e, tmpl) 
e.preventDefault();
var currentUserId = Meteor.userId();
console.log(currentUserId);
var addressDetails = 
  address: 
    streetAddress: $('#streetAddress').val()
  
;
console.log(addressDetails);
Meteor.call('addAddress', addressDetails, currentUserId, function(error) 
  if (error) 
    alert(error.reason);
   else 
    console.log('success!');
    Router.go('Admin');
  
);

);

我插入地址的方法:

Meteor.methods(
'addAddress': function(addressDetails, currUserId) 

    var currentUserId = currUserId;

    console.log('user to add address to is ' + currUserId);

    Meteor.users.update(currentUserId, $addToSet:
        
            'address.streetAddress': addressDetails.streetAddress
        
      );
    

);

请注意,当我在控制台中键入该查询时,它会起作用:

db.users.update(_id: 'Qdf89k3fd93jfdk', $addToSet: 'address.streetAddress': '12345 fake st');

提前感谢您!

【问题讨论】:

您可以发布您的示例数据以及您尝试过的查询吗? 【参考方案1】:

您的addressDetails 对象没有streetAddress 字段,因此addressDetails.streetAddress 返回undefined。在更新中改用addressDetails.address.streetAddress。而且,就像 Joshua 指出的那样,使用 _id: currUserId 的对象作为选择器。所以整个函数应该是:

Meteor.users.update(  _id: currentUserId , $addToSet:
    
        'address.streetAddress': addressDetails.address.streetAddress
    
  );

还有一件事,您不应该从客户端传递 userId。您定义的任何方法都可以从客户端调用,就像这样,我可以使用任何 userId 从浏览器控制台调用您的方法'addAddress' 来更新他们的地址。相反,在方法调用中使用this.userId 对象(参见here)并检查它是否不是null,即用户已登录。

if (! this.userId)
  throw new Meteor.Error(401, "You must be logged in!");
var currentUserId = this.userId;

【讨论】:

【参考方案2】:

看起来您是在将文档 ID 直接传递到 MongoDB 查询方法中,而不是构造一个具有 _id 属性且值为所述文档 ID 的对象。

即尝试

var currentUserId =  _id: currUserId ;

【讨论】:

这在 Meteor 中不是必需的,集合方法都明确接受 Mongo Selector、ObjectID 或 String 作为第一个参数。

以上是关于什么是 MongoDB 修饰符和运算符?的主要内容,如果未能解决你的问题,请参考以下文章

typescript 访问修饰符和 javascript 访问修饰符有啥区别?在使用打字稿时我应该更喜欢哪一个?

vue事件修饰符和键盘事件

Java修饰符和String

java修饰符和基本操作符

Java基础知识回顾之二 ----- 修饰符和String

Java基础知识回顾之二 ----- 修饰符和String