meteor mongo 驱动程序可以处理 $each 和 $position 运算符吗?
Can meteor mongo driver handle $each and $position operators?
我正在使用最新的 meteor bundle 开发一个 meteor 应用程序。我想重新定位 mongo 文档数组中的项目。为了实现这一点,我 $pull
它从数组中取出,然后 $push
它根据 mongoDB documentation.
在特定的 index
位置
MyCollection.update({_id: my_doc.id},
{
$push:
{
my_array:
{
$each:[my_item.id],
$position:index
}
}
}
)
Meteor/Mongo 抛出以下错误:
update failed: MongoError: Can't canonicalize query: BadValue unknown
top level operator: $each
我首先实现了这个客户端。由于 minimongo 限制,我认为它不起作用。
我写了一个方法来处理这个服务器端,但我最终遇到了同样的错误。
这个请求有什么问题,meteor 可以处理 $each 运算符吗?
EDIT :我试图将它直接插入到 robomongo 中,它成功了。 Mongo 版本,输入时 db.version()
returns 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
,我在 index
位置拉动和推动 my_item.id
如果您使用 new Mongo.Collection('col')
创建一个 Meteor 集合,您会得到一个 Minimongo 实例,它不是本机 Node MongoDriver,对吗?
所以有些方法只是行不通或不完全支持..比如collection.aggregate
但您可以通过 Col.rawCollection()
轻松访问本机驱动程序并直接在本机实例上执行查询。 本机实例当然只能在服务器上访问。
所以你有几种方法可以做你想做的事,例如你可以先获取数组,按照你想要的方式使用它
$set: {my_array: sortedArray }
我个人更喜欢这种方式,因为您只需要执行一次更新操作而不是两次 ($pull
& $push at $position
)
但是如果你想用 $push at $position 的方式来做.. 只需使用本机驱动程序就可以了
var col = Collection.rawCollection();
var result = Meteor.wrapAsync(col.update.bind(col)(
/* update query goes here */
);
注意:你需要 Meteor.wrapAsync 因为 Meteor 同步风格,你也可以不用它。 Collection.rawCollection().update(...)
我正在使用最新的 meteor bundle 开发一个 meteor 应用程序。我想重新定位 mongo 文档数组中的项目。为了实现这一点,我 $pull
它从数组中取出,然后 $push
它根据 mongoDB documentation.
index
位置
MyCollection.update({_id: my_doc.id},
{
$push:
{
my_array:
{
$each:[my_item.id],
$position:index
}
}
}
)
Meteor/Mongo 抛出以下错误:
update failed: MongoError: Can't canonicalize query: BadValue unknown top level operator: $each
我首先实现了这个客户端。由于 minimongo 限制,我认为它不起作用。
我写了一个方法来处理这个服务器端,但我最终遇到了同样的错误。
这个请求有什么问题,meteor 可以处理 $each 运算符吗?
EDIT :我试图将它直接插入到 robomongo 中,它成功了。 Mongo 版本,输入时 db.version()
returns 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
,我在 index
my_item.id
如果您使用 new Mongo.Collection('col')
创建一个 Meteor 集合,您会得到一个 Minimongo 实例,它不是本机 Node MongoDriver,对吗?
所以有些方法只是行不通或不完全支持..比如collection.aggregate
但您可以通过 Col.rawCollection()
轻松访问本机驱动程序并直接在本机实例上执行查询。 本机实例当然只能在服务器上访问。
所以你有几种方法可以做你想做的事,例如你可以先获取数组,按照你想要的方式使用它
$set: {my_array: sortedArray }
我个人更喜欢这种方式,因为您只需要执行一次更新操作而不是两次 ($pull
& $push at $position
)
但是如果你想用 $push at $position 的方式来做.. 只需使用本机驱动程序就可以了
var col = Collection.rawCollection();
var result = Meteor.wrapAsync(col.update.bind(col)(
/* update query goes here */
);
注意:你需要 Meteor.wrapAsync 因为 Meteor 同步风格,你也可以不用它。 Collection.rawCollection().update(...)