添加新字段,该字段是文档的另一个字段的大小

时间:2016-09-21 04:20:01

标签: mongodb mongodb-query aggregation-framework

我是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" :"美元($)前缀字段' $ size'在' numadx。$ size'是   不适用于存储。"

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

非常感谢。

3 个答案:

答案 0 :(得分:0)

$addFieldsnew feature in Mongo 3.4,可以解答这个问题: 它允许您通过将聚合的产品存储在记录

中来更新集合的记录
db.collection.aggregate(   
     [ {          
          "$addFields": {  "numadx": { $size: "$verticals" } }       
        },
        { "$out":"collection"}
     ]    
)

答案 1 :(得分:-1)

我不认为$ size是MongoDB中的更新运算符。更新运算符为https://docs.mongodb.com/manual/reference/operator/update-field/。我从来没有见过$ size以外的其他任何地方使用

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

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

答案 2 :(得分:-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()查询以仅处理您的数据的子集,否则它将针对您的集合中的每个文档运行。

有关详细信息,请参阅: