Mongodb 添加新字段,其大小与文档的另一个字段相同
我是MongoDB的新手,我想问一下如何为元素创建一个新字段,它表示该元素中另一个字段的大小。例如: -我有这样的元素:Mongodb 添加新字段,其大小与文档的另一个字段相同,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我是MongoDB的新手,我想问一下如何为元素创建一个新字段,它表示该元素中另一个字段的大小。例如: -我有这样的元素: { "_id" : ObjectId("57e1ffcb94d9ae534869c6cd"), "url" : "http://www.nytimes.com", "verticals" : [ 1, 2, 3, 4, 5, 12 ] } 我想添加一个新的字段,比如“numadx”,它是“垂直”数组的大小,在本例中,它是6。结果可能是: { "_i
{
"_id" : ObjectId("57e1ffcb94d9ae534869c6cd"),
"url" : "http://www.nytimes.com",
"verticals" : [ 1, 2, 3, 4, 5, 12 ]
}
我想添加一个新的字段,比如“numadx”,它是“垂直”数组的大小,在本例中,它是6。结果可能是:
{
"_id" : ObjectId("57e1ffcb94d9ae534869c6cd"),
"url" : "http://www.nytimes.com",
"verticals" : [ 1, 2, 3, 4, 5, 12 ]
"numadx" : 6
}
我使用终端中的命令:
db.test.update({},{$set:{numadx:{$size: "$verticals"}}},{multi:true})
但它会返回错误:
“errmsg”:“numadx.$size”中以美元($)为前缀的字段“$size”为
对存储无效。”
有人能帮我吗?我这样做是为了根据numadx字段对集合中的元素进行排序,这有助于我知道集合中这些元素的垂直值的最少到最多数量
非常感谢。我不认为$size是MongoDB中的更新操作符。更新运算符为。我从来没有见过$size在任何地方使用过,除了在类似的查找中
db.test.find( { verticals: { $size: 6 } } );
我认为不可能在更新中使用它。您需要显式读取新数组中的记录和插孔。当前在MongoDB中,您无法使用文档中的某些计算值更新文档。另外,Bob正确地指出,
$size
不是update()
命令识别的运算符
话虽如此,有一种方法可以使用mongo
shell脚本实现您想要的:
db.test.find().forEach(function(doc){
db.test.update({_id:doc._id}, {$set:{numadx:doc.verticals.length}})
})
此脚本将进入集合中的每个文档,并使用可在doc
变量中访问的当前文档的值设置numadx
字段
您可以修改那里的find()
查询以仅处理数据的子集,否则它将对集合中的每个文档运行
有关更多信息,请参阅:
$addFields
是一个解决以下问题的方法:
它允许您通过将聚合产品存储在记录中来更新集合的记录
db.collection.aggregate(
[ {
"$addFields": { "numadx": { $size: "$verticals" } }
},
{ "$out":"collection"}
]
)
哦,我明白了,但我仍然无法获得该数组的大小并将其更新到该元素的新字段xDoh谢谢,它工作得很顺利。哦,我已经看到我们不能在update()命令xD中使用$size,非常感谢。不要这样做。这对性能非常不利,并可能导致争用情况。性能非常差…与MongoDB 3.4一样,
$out
阶段只能如此,因此这不是更新现有文档的可行解决方案。