【问题标题】:Meteor - MongoDB Error: Cannot apply $addToSet modifier to non-arrayMeteor - MongoDB 错误:无法将 $addToSet 修饰符应用于非数组
【发布时间】:2013-01-05 22:38:34
【问题描述】:

我正在关注 Isaac Strack 最近出版的书“Getting Started with Meteor.js JavaScript Framework”。这本书适用于 Meteor 0.5.0。我正在使用 0.5.4 版。

在本书中,您构建了一个应用程序,其中包含几个类别,您可以在其中插入数据以跟踪家居用品,以及它们可能被借给谁。我将应用程序部署到meteor subdomain,它运行良好。它不会复制我的本地 MongoDB 错误。

我在第 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

“工具”类别中已有一项已在本教程前面提交。如果我在控制台中输入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

但是,屏幕输出是空白的:

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

您可以view the app here。你可以在我的GitHub查看代码。

【问题讨论】:

  • 只有工具可以做到这一点吗?你可以尝试运行meteor reset(请备份你所有的东西它会清除数据库)看看它是否仍然发生?我觉得它是数据库,因为当您部署到meteor.com 时,它使用一个新的数据库
  • @Akshat 成功了,谢谢!是的,只有“工具”不合作。
  • 您可能之前在教程中手动添加了它,但是这些项目的数组类型错误(我怀疑是关联的,使用大括号 {} 而不是直括号 [])
  • @Akshat 我认为你是完全正确的。如果您将此转换为我很乐意接受的答案。
  • 嘿,我遇到了同样的问题,是的,“流星重置”似乎可以解决这个错误。

标签: mongodb meteor


【解决方案1】:
function addItem(list_id, item_name) {
    if(!item_name && !list_id)
      return;
    lists.update({_id:list_id}, {$addToSet:{items:{Name:item_name}}});
  }

似乎您正在尝试将对象添加到集合中。您在模拟时遇到错误。让我们调查那个错误。出错的代码:

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 { ...

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

看看你的代码:

Object
  Category: "Tools"
  _id: "eaa681e1-83f2-49f2-a42b-c6d84e526270"
...
  items: Object
...

items 是一个对象,而不是一个数组!会报错。

你能用 Mongo $addToSet 到一个对象吗?让我们看一下代码。

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 );
            ...
        }

不!这是来自旧的 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);
    }
  }
},

试试lists.insert({Category:catVal,items:[]})。这样items在第一次使用时就被初始化为一个数组而不是一个对象。

另外,我不认为$addToSet 会以您希望的方式比较数组中的对象,因此请考虑创建一个包含categoryId 的单独集合Items

它在一个地方而不是另一个地方工作纯属巧合。

【讨论】:

  • 很好的回应!深入研究这个问题,相信你刚刚在我正在关注的教程中带来了一个问题。这本书从未指定在这种类型的提交中使用数组而不是对象的必要性。通过运行meteor reset,我能够通过对我的答案的评论来解决当前的问题,但您似乎对相关书籍提出了更大的问题。
【解决方案2】:

按照相同的指南,我遇到了同样的问题。当直接使用指南(工具和 DVD)中的插入时,minimongo 将项目作为对象而不是数组插入。我不知道这是否只是一个错误,或者代码库是否已更改,无论哪种方式我都更改了:

lists.insert({Category:"DVDs", items: {Name:"Mission Impossible", Owner:"me", LentTo:"Alice"}});

lists.insert({Category:"DVDs", items: [{Name:"Mission Impossible", Owner:"me",LentTo:"Alice"}]});

只是将项目封装在 [] 中以强制将其放入数组中,并且对工具的插入也是如此。现在效果很好。

【讨论】:

    猜你喜欢
    • 2015-05-07
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多