2016-09-21 63 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

相關問題