Meteor - MongoDB错误:无法将$ addToSet修饰符应用于非数组

rob*_*bby 3 mongodb meteor

我正在关注Isaac Strack 最近出版的" Meteor.js JavaScript框架入门 "一书.这本书适用于Meteor 0.5.0.我正在使用0.5.4版.

在本书中,您构建了一个应用程序,其中包含几个类别,您可以在其中插入数据以跟踪家居用品,以及他们可能借给谁.我将应用程序部署到流星子域,它运行正常.它不会复制我的本地MongoDB错误.

LendLib

我在第5章,我刚从应用程序中删除了自动发布,并指定了我的本地数据通道.

在本地,仅在"工具"类别下,当我尝试向该类别添加新项目时,我在浏览器控制台中收到此错误:

Exception while simulating the effect of invoking '/Lists/update' Error {} Error: Cannot apply $addToSet modifier to non-array
    at Error (<anonymous>)
    at LocalCollection._modifiers.$addToSet (http://localhost:3000/packages/minimongo/modify.js?e7f02f0df0bff9f0b97236f9548637b7ede1ac74:178:13)
    at Function.LocalCollection._modify (http://localhost:3000/packages/minimongo/modify.js?e7f02f0df0bff9f0b97236f9548637b7ede1ac74:53:9)
    at LocalCollection._modifyAndNotify (http://localhost:3000/packages/minimongo/minimongo.js?7f5131f0f3d86c8269a6e6db0e2467e28eff6422:474:19)
    at LocalCollection.update (http://localhost:3000/packages/minimongo/minimongo.js?7f5131f0f3d86c8269a6e6db0e2467e28eff6422:444:12)
    at m.(anonymous function) (http://localhost:3000/packages/mongo-livedata/collection.js?3ef9efcb8726ddf54f58384b2d8f226aaec8fd53:415:36)
    at http://localhost:3000/packages/livedata/livedata_connection.js?367884963b120d457819216ff713b2586b266dde:540:25
    at _.extend.withValue (http://localhost:3000/packages/meteor/dynamics_browser.js?46b8d1f1158040fcc2beb7906ec2f932871a398d:21:19)
    at _.extend.apply (http://localhost:3000/packages/livedata/livedata_connection.js?367884963b120d457819216ff713b2586b266dde:539:47)
    at Meteor.Collection.(anonymous function) [as update] (http://localhost:3000/packages/mongo-livedata/collection.js?3ef9efcb8726ddf54f58384b2d8f226aaec8fd53:266:23) logging.js:30
update failed: Internal server error logging.js:30
Run Code Online (Sandbox Code Playgroud)

工具类别中已经有一个项目,它在本教程前面提交过.如果我输入控制台,lists.findOne({Category:"Tools"});我会得到识别对象中项目的输出:

Object
  Category: "Tools"
  _id: "eaa681e1-83f2-49f2-a42b-c6d84e526270"
    items: Object
      LentTo: "Steve"
      Name: "Linear Compression Wrench"
      Owner: "me"
      __proto__: Object
  __proto__: Object
Run Code Online (Sandbox Code Playgroud)

但是,屏幕输出为空白:

在此输入图像描述

当然我已经尝试重新启动流星服务器并关闭浏览器,但没有解决方案.我是MongoDB的新手,所以我不清楚在哪里转向了解导致此问题的原因或原因.

您可以在此处查看该应用.您可以在我的GitHub上查看代码.

Doc*_*oss 11

function addItem(list_id, item_name) {
    if(!item_name && !list_id)
      return;
    lists.update({_id:list_id}, {$addToSet:{items:{Name:item_name}}});
  }
Run Code Online (Sandbox Code Playgroud)

好像你正在尝试将一个对象添加到一个集合中.您在模拟时遇到错误.让我们调查一下这个错误.出错的代码:

https://github.com/meteor/meteor/blob/master/packages/minimongo/modify.js

 $addToSet: function (target, field, arg) {
    var x = target[field];
    if (x === undefined)
      target[field] = [arg];
    else if (!(x instanceof Array))
      throw Error("Cannot apply $addToSet modifier to non-array");
    else { ...
Run Code Online (Sandbox Code Playgroud)

哦,哦throw Error("Cannot apply $addToSet modifier to non-array.").

看看你的代码:

Object
  Category: "Tools"
  _id: "eaa681e1-83f2-49f2-a42b-c6d84e526270"
...
  items: Object
...
Run Code Online (Sandbox Code Playgroud)

items是一个对象,而不是一个数组!它会出错.

$addToSet能用Mongo做一个对象吗?我们来看看代码吧.

https://github.com/mongodb/mongo/blob/4a4f9b1d6dc79d1ba4a7d7eaa9e4eb6d00aa466c/db/update.cpp

 case ADDTOSET: {
            uassert( 12592 ,  "$addToSet can only be applied to an array" , in.type() == Array );
            ...
        }
Run Code Online (Sandbox Code Playgroud)

不!这是来自旧的Mongo代码,因为当代代码库是庞大的,但同样的事情.

我只insert在你的代码中找到了一个.

'keyup #add-category': function(e, t) {
  if (e.which === 13) {
    var catVal = String(e.target.value || "");
    if (catVal) {
      lists.insert({Category:catVal});
      Session.set('adding_category', false);
    }
  }
},
Run Code Online (Sandbox Code Playgroud)

试试lists.insert({Category:catVal,items:[]}).因此,在首次使用时,项目将初始化为数组而不是对象.

另外,我不认为$addToSet以你想要的方式比较数组中的对象,所以考虑制作一个Items包含a 的单独集合categoryId.

它纯粹是巧合,它在一个地方而不是另一个地方工作.