【问题标题】:Meteor MongoDB Setting field of array per documentMeteor MongoDB 设置每个文档的数组字段
【发布时间】:2020-05-23 07:44:21
【问题描述】:

我在Collection 中有一个Documents,它的字段是Array (foo)。这是其他subdocumentsArray。我想为每个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”。有任何想法吗? 我对父文档和子文档都使用 SimpleSchema

谢谢!

【问题讨论】:

  • 请提供一些示例数据和架构,最新版本的 MongoDB 允许您根据当前文档使用值更新文档
  • 如果您的问题只关注复选框值,我假设它们是布尔值,您可以将批量更新分为两组,一组为true,另一组为false
  • 只更新根据您的应用程序更改的复选框也可能有意义

标签: javascript node.js mongodb meteor


【解决方案1】:

尝试传递一个选项以绕过简单架构。它可能缺乏对这个(有些)较新的 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() 会引发异常。

【讨论】:

  • 刚刚澄清了我的问题,因为我意识到我正在为每个文档更改相同的值
  • 感谢您的回复。我在其中添加了该选项,但现在得到了“MinimongoError:位置运算符未找到查询所需的匹配项”。这很奇怪,我不知道为什么 MiniMongo 会抱怨。
  • Nm,我不得不将Update 包裹在Meteor.isServer 中。我将此标记为已接受。但是绕过 SimpleSchema 有什么影响吗?就我而言,似乎没有太大风险,因为我只是在更新一个字段,但想知道您的想法。谢谢
  • 首先,确保您使用的是最新的 Simple Schema(来自 npm,而不是 Meteor 包)。如果您使用的是流星包,您可能需要更改代码以支持该功能。然后,如果问题仍然存在,我建议在 Simple Schema Github repo 上提出问题,因为这是一个错误。它应该支持 3.6 版本中引入的 Mongo 语法。
【解决方案2】:

如果您的数据在数组中每个条目的 $set 中有不同的数据,我认为您需要在服务器端进行循环。

Mongo 有 Bulk 操作,但我不知道你是否可以使用 Collection.rawCollection().XXXXX 调用它们
我使用rawCollection() 来访问聚合,它对我来说很好用。也许可以处理批量操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2012-02-20
    • 2017-04-08
    • 1970-01-01
    相关资源
    最近更新 更多