Javascript 对存储无效
我得到一个错误: “analytics.visits.amounts..$size”中以美元($)为前缀的字段“$size”对存储无效 我试着做的是我有一个名为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
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()
]
]
},
}
}
])