2016-09-21 57 views
3

我是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" : "The dollar ($) prefixed field '$size' in 'numadx.$size' is not valid for storage."

有人可以帮我:D?我这样做是为了根据numadx字段对这个集合中的元素进行排序,这有助于我最少了解这些元素在集合中的最大垂直值。

非常感谢。

回答

-1

目前在MongoDB中,您无法使用该文档中的某个计算值更新文档。此外,Bob正确$size不是update()命令认可的运营商。

话虽如此,有一种方法来实现你想要使用什么mongo shell脚本:

db.test.find().forEach(function(doc){ 
    db.test.update({_id:doc._id}, {$set:{numadx:doc.verticals.length}}) 
}) 

该脚本将进入您的收藏中的每个文件,并使用的值设置numadx场当前文档可在doc变量中访问。

您可以在那里修改find()查询以仅处理数据的一个子集,否则它将针对集合中的每个文档运行。

欲了解更多信息,请访问:

+0

哦,谢谢你,它工作顺利。哦,我已经看到,我们不能在update()命令xD中使用$ size,非常感谢。 – Blurie

+0

不要这样做。这对性能非常不利,并可能导致竞争状况。 – styvane

+0

性能非常差...... – c24b

-1

我不认为$ size是MongoDB中的更新操作符。更新操作符是https://docs.mongodb.com/manual/reference/operator/update-field/。我从来没有见过在发现任何地方使用其他超过$大小像

db.test.find({ verticals: { $size: 6 } }); 

我认为它不可能使用在更新。您将需要明确地读取新阵列中的记录和插孔。

+0

哦,我明白了,但我仍然无法获得该数组的大小并将其更新为该元素的新字段xD – Blurie

0

$addFields是一个new feature in Mongo 3.4是不会忽略的问题: 它可以让你通过存储更新集合的记录记录内的聚合产品

db.collection.aggregate( 
    [ {   
      "$addFields": { "numadx": { $size: "$verticals" } }  
     }, 
     { "$out":"collection"} 
    ]  
) 
+0

与在MongoDB 3.4中一样,'$ out'阶段只能[创建一个新的集合或替换现有的集合](https://docs.mongodb.com/manual/reference/operator/aggregation/out /#行为),因此这不是更新现有文档的可行解决方案。 – Stennie

相关问题