gpt4 book ai didi

mongodb - meteor - MongoDB 错误 : Cannot apply $addToSet modifier to non-array

转载 作者:可可西里 更新时间:2023-11-01 09:18:38 29 4
gpt4 key购买 nike

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

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

LendLib

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

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

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

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

enter image description here

当然,我已经尝试重新启动 meteor 服务器并关闭浏览器,但没有解决办法。我是 MongoDB 的新手,所以我不清楚该去哪里了解导致此问题的原因或原因。

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

最佳答案

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

呃哦,抛出错误(“无法将 $addToSet 修饰符应用于非数组。”)

看看你的代码:

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 不会按照您希望的方式比较数组中的对象,因此请考虑创建一个单独的集合 Items,其中包含一个 categoryId.

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

关于mongodb - meteor - MongoDB 错误 : Cannot apply $addToSet modifier to non-array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14462962/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com