Meteor MongoDB 设置每个文档的数组字段
Meteor MongoDB Setting field of array per document
我在 Collection
中有一个 Documents
,它有一个字段是 Array
(foo)。这是其他 subdocuments
的 Array
。我想将每个 document
中的每个 subdocument
的相同字段(栏)设置为相同的值。该值来自复选框。
所以..我的客户端代码类似于
'click #checkAll'(e, template) {
const target = e.target;
const checked = $(target).prop('checked');
//Call Server Method to update list of Docs
const docIds = getIds();
Meteor.call('updateAllSubDocs', docIds, checked);
}
我尝试使用 https://docs.mongodb.com/manual/reference/operator/update/positional-all/#positional-update-all
并为我的服务器助手方法提出了以下内容。
'updateAllSubDocs'(ids, checked) {
Items.update({ _id: { $in: ids } }, { $set: { "foo.$[].bar": bar } },
{ multi: true }, function (err, result) {
if (err) {
throw new Meteor.Error('error updating');
}
});
}
但这会引发错误 'foo.$[].bar is not allowed by the Schema'。有任何想法吗?
我对父文档和子文档都使用 SimpleSchema
谢谢!
如果您的数据在数组的每个条目的 $set 中有不同的数据,我认为您需要在服务器端进行循环。
Mongo 有批量操作,但我不知道你是否可以使用 Collection.rawCollection().XXXXX
调用它们
我已经使用 rawCollection()
访问聚合,它对我来说很好用。也许可以进行批量操作。
尝试传递绕过简单架构的选项。它可能不支持这个(有点)较新的 Mongo 功能。
bypassCollection2
示例:
Items.update({ _id: { $in: ids } }, { $set: { "foo.$[].bar": bar } },
{ multi: true, bypassCollection2: true }, function (err, result) {
if (err) {
throw new Meteor.Error('error updating');
}
});
旧答案:
既然您说您需要对每个文档进行唯一更新,那么在这种情况下,批量更新似乎是可行的方法。下面是如何在 Meteor 中执行此操作的示例。
if (docsToUpdate.length < 1) return
const bulk = MyCollection.rawCollection().initializeUnorderedBulkOp()
for (const myDoc of docsToUpdate) {
bulk.find({ _id: myDoc._id }).updateOne({ $set: update })
}
Promise.await(bulk.execute()) // or use regular await if you want...
请注意,如果没有文档,我们会提前退出该函数,因为如果没有要处理的操作,bulk.execute()
会抛出异常。
我在 Collection
中有一个 Documents
,它有一个字段是 Array
(foo)。这是其他 subdocuments
的 Array
。我想将每个 document
中的每个 subdocument
的相同字段(栏)设置为相同的值。该值来自复选框。
所以..我的客户端代码类似于
'click #checkAll'(e, template) {
const target = e.target;
const checked = $(target).prop('checked');
//Call Server Method to update list of Docs
const docIds = getIds();
Meteor.call('updateAllSubDocs', docIds, checked);
}
我尝试使用 https://docs.mongodb.com/manual/reference/operator/update/positional-all/#positional-update-all
并为我的服务器助手方法提出了以下内容。
'updateAllSubDocs'(ids, checked) {
Items.update({ _id: { $in: ids } }, { $set: { "foo.$[].bar": bar } },
{ multi: true }, function (err, result) {
if (err) {
throw new Meteor.Error('error updating');
}
});
}
但这会引发错误 'foo.$[].bar is not allowed by the Schema'。有任何想法吗? 我对父文档和子文档都使用 SimpleSchema
谢谢!
如果您的数据在数组的每个条目的 $set 中有不同的数据,我认为您需要在服务器端进行循环。
Mongo 有批量操作,但我不知道你是否可以使用 Collection.rawCollection().XXXXX
调用它们
我已经使用 rawCollection()
访问聚合,它对我来说很好用。也许可以进行批量操作。
尝试传递绕过简单架构的选项。它可能不支持这个(有点)较新的 Mongo 功能。
bypassCollection2
示例:
Items.update({ _id: { $in: ids } }, { $set: { "foo.$[].bar": bar } },
{ multi: true, bypassCollection2: true }, function (err, result) {
if (err) {
throw new Meteor.Error('error updating');
}
});
旧答案:
既然您说您需要对每个文档进行唯一更新,那么在这种情况下,批量更新似乎是可行的方法。下面是如何在 Meteor 中执行此操作的示例。
if (docsToUpdate.length < 1) return
const bulk = MyCollection.rawCollection().initializeUnorderedBulkOp()
for (const myDoc of docsToUpdate) {
bulk.find({ _id: myDoc._id }).updateOne({ $set: update })
}
Promise.await(bulk.execute()) // or use regular await if you want...
请注意,如果没有文档,我们会提前退出该函数,因为如果没有要处理的操作,bulk.execute()
会抛出异常。