我使用流星包进行流星应用程序更新。我想重新定位mongo文档数组中的项目。为实现这一目标,我$pull
将其排除在数组之外,然后根据mongoDB documentation将其$push
置于特定的index
位置。
MyCollection.update({_id: my_doc.id},
{
$push:
{
my_array:
{
$each:[my_item.id],
$position:index
}
}
}
)
Meteor / Mongo会抛出以下错误:
更新失败:MongoError:无法规范化查询:BadValue unknown 顶级运营商:$ each
我首先实现了这个客户端。我认为它因为极小的限制而无法工作。
我写了一个方法来处理这个服务器端,但我最终得到了同样的错误。
此请求有什么问题,meteor可以处理$ each运算符吗?
编辑:我试图直接在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_array
,我将my_item.id
拉到index
位置
答案 0 :(得分:5)
如果使用new Mongo.Collection('col')
创建Meteor集合,则会返回一个不是本机Node MongoDriver的Minimongo实例,对吧?
所以有些方法不起作用或不完全支持..比如collection.aggregate
但您可以通过Col.rawCollection()
轻松访问本机驱动程序,并直接在本机实例上执行查询。 原生实例只能在服务器上访问,当然。
所以要做你想做的事,你有几种方法,例如你可以先拿出阵列,按照你想要的方式,
$set: {my_array: sortedArray }
我个人更喜欢这种方式,因为你只需要做一次更新操作而不是两次($pull
& $push at $position
)
但是如果你想以$ position的方式进行$ push ...只需使用本机驱动程序
var col = Collection.rawCollection();
var result = Meteor.wrapAsync(col.update.bind(col)(
/* update query goes here */
);
注意:由于Meteor同步风格,你需要Meteor.wrapAsync,你也可以不用它。的 Collection.rawCollection()。更新(...)强> 的