Javascript 对存储无效

Javascript 对存储无效,javascript,node.js,typescript,mongodb,Javascript,Node.js,Typescript,Mongodb,我得到一个错误: “analytics.visits.amounts..$size”中以美元($)为前缀的字段“$size”对存储无效 我试着做的是我有一个名为ips的数组,我有另一个数组amounts,我试着将ips的大小推到amounts数组中 单个文档的结构为: { offices: [{ ips: [] }], analytics: { visits: { amounts: [], da

我得到一个错误:

“analytics.visits.amounts..$size”中以美元($)为前缀的字段“$size”对存储无效

我试着做的是我有一个名为
ips
的数组,我有另一个数组
amounts
,我试着将
ips
的大小推到amounts数组中

单个文档的结构为:

{
    offices: [{
       ips: []
    }],
    analytics: {
        visits: {
            amounts: [],
            dates: []
        }
    }
}

正常的更新语法不能使用文档变量值,这意味着
$ips
是导致错误的原因

对于Mongo v4.2+,他们引入了允许您在更新中使用文档值的功能,如下所示:

db.collection.updateMany(
{},
[
  {
    $set: {
      "analytics.visits.amounts": {
        $concatArrays: [
          "$analytics.visits.amounts",
          [
            {
              $reduce: {
                input: "$offices",
                initialValue: 0,
                in: {
                  $sum: [
                    {
                      $size: "$$this.ips"
                    },
                    "$$value"
                  ]
                }
              }
            }
          ]
        ]
      },
      "analytics.visits.dates": {
        $concatArrays: [
          "$analytics.visits.dates",
          [
            new Date()
          ]
        ]
      },
      
    }
  }
])


如果您使用的是较旧的Mongo版本,则必须将文档读入内存,以便获取更新中使用的
ips
值。

谢谢您的回答。我问错了,你能看一下吗?
ips
数组实际上位于
offices
数组中。我需要对所有
IP的大小求和
,然后将其添加到在修复中编辑的
金额
数组中。您可以使用
$reduce
轻松使用此值。
db.collection.updateMany(
{},
[
  {
    $set: {
      "analytics.visits.amounts": {
        $concatArrays: [
          "$analytics.visits.amounts",
          [
            {
              $reduce: {
                input: "$offices",
                initialValue: 0,
                in: {
                  $sum: [
                    {
                      $size: "$$this.ips"
                    },
                    "$$value"
                  ]
                }
              }
            }
          ]
        ]
      },
      "analytics.visits.dates": {
        $concatArrays: [
          "$analytics.visits.dates",
          [
            new Date()
          ]
        ]
      },
      
    }
  }
])