Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 添加新字段,其大小与文档的另一个字段相同_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

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

我是MongoDB的新手,我想问一下如何为元素创建一个新字段,它表示该元素中另一个字段的大小。例如: -我有这样的元素:

{ 
  "_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
阶段只能如此,因此这不是更新现有文档的可行解决方案。