Mongodb meteor mongo驱动程序可以处理$each和$position操作员吗?
我使用最新的meteor bundle开发meteor应用程序。我想在mongo文档数组中重新定位项目。为了实现这一点,我将它从数组中拉出,然后将它推到特定的索引位置 Meteor/Mongo抛出以下错误: 更新失败:MongoError:无法规范化查询:BadValue未知 顶级操作员:$每个 我首先实现了这个客户端。我认为它不起作用是因为minimongo的限制 我编写了一个方法来处理这个服务器端,但最终还是出现了相同的错误 这个请求有什么问题,meteor能处理每个操作员的$1吗Mongodb meteor mongo驱动程序可以处理$each和$position操作员吗?,mongodb,meteor,minimongo,Mongodb,Meteor,Minimongo,我使用最新的meteor bundle开发meteor应用程序。我想在mongo文档数组中重新定位项目。为了实现这一点,我将它从数组中拉出,然后将它推到特定的索引位置 Meteor/Mongo抛出以下错误: 更新失败:MongoError:无法规范化查询:BadValue未知 顶级操作员:$每个 我首先实现了这个客户端。我认为它不起作用是因为minimongo的限制 我编写了一个方法来处理这个服务器端,但最终还是出现了相同的错误 这个请求有什么问题,meteor能处理每个操作员的$1吗 编辑:
编辑:我试着直接在robomongo中插入它,结果成功了。Mongo版本,当键入
db.version()
时返回2.6.7
*EDIT2:我没想到会这样,所以我之前没有检查:更新工作正常,包括
$pull
和$push
。然而,即使数据确实更新了,我仍然会得到错误
*编辑:以下是一些示例数据:
{
"_id" : "oSNrpgAAu8BuznvD6",
"name" : "tynhjderjye",
"description" : "",
"notes" : "",
"display_notes" : false,
"keywords" : [
""
],
"owner" : "mA5Y7LBCoRyeSDkaG",
"createdAt" : ISODate("2015-10-27T13:59:06.083Z"),
"createdBy" : "C3i9oj4eapyttHZj6",
"contributors" : [
"C3i9oj4eapyttHZj6"
],
"medias" : [
"TcFqermNY4y5cjBG3",
"dbkNN2rxXJXth8urw",
"jML4JKkRoKxx8sLwu",
"LEWYsnPrXRSH6MPkX"
],
"modifiedAt" : ISODate("2015-11-17T09:35:50.303Z"),
"modifiedBy" : "C3i9oj4eapyttHZj6",
"chunks" : [
"qCCHKJDbdTLEFR5Yt",
"ySiM7dcxvduEM2npj",
"5q46vqrmYttscitiK"
],
"trashed" : ISODate("2015-11-17T09:35:50.303Z")
}
chunks
是数组my_数组
我在index
位置拉推my_item.id
如果你用新建Mongo.Collection('col')
创建Meteor集合,你会得到一个不是本机节点MongoDriver的Minimongo实例,对吗
因此,有些方法不起作用或不完全受支持。。如collection.aggregate
但是您可以通过Col.rawCollection()
轻松访问本机驱动程序,并直接在本机实例上执行查询本机实例当然只能在服务器上访问
所以,要想做你想做的事,你有几种方法,例如,你可以先使用数组,按照你的意愿使用它,然后
$set:{my_数组:sortedArray}
就个人而言,我更喜欢这种方式,因为您只需要执行一次更新操作,而不是两次($pull
&$push at$position
)
但是如果你想用$push在$position的方式来做。。只需使用本机驱动程序即可
var col = Collection.rawCollection();
var result = Meteor.wrapAsync(col.update.bind(col)(
/* update query goes here */
);
注意:你需要Meteor.wrapAsync,因为Meteor同步风格,你也可以不用它Collection.rawCollection().update(…)您的MongoDB服务器的版本是什么?尝试在
mongo
shell客户端中执行相同的命令。@DmytroShevchenko相同的命令在RoboMongo中工作正常(我想相当于shell客户端)。@Billybobbonne如果该命令在RoboMongo中对同一服务器工作,然后问题是Meteor的MongoDB驱动程序,而不是服务器的版本。我相应地更新了问题标题和内容。感谢您提供有关使用Meteor的本机mongo驱动程序的提示。然而,这是行不通的。我不明白。你的技术也有同样的错误。似乎原因是$each
中的id。然而,我检查了它的类型(字符串),有没有将它放入数组,我检查了它是否匹配数据库中的真实内容,最后我在一个直接mongo请求中检查了它。Mongo请求起作用,meteor的update
命令和我问题中的代码起作用,但它仍然会触发那里提到的错误(无论是否使用rawCollection()
技术)。我可能会切换到使用$set
的方法,并替换整个数组,这可能会解决问题。然而,我仍然不知道为什么会发生这个错误,这让我感到困扰:-)很抱歉让赏金变质,我想你已经得到了一半的赏金。我不会将这个答案标记为已接受,以防有人拿出真正的答案。感谢你和所有的评论者的帮助。
var col = Collection.rawCollection();
var result = Meteor.wrapAsync(col.update.bind(col)(
/* update query goes here */
);