添加新字段,它是文档另一个字段的大小[重复]

Posted

技术标签:

【中文标题】添加新字段,它是文档另一个字段的大小[重复]【英文标题】:Add new field which is the size of another field of the document [duplicate] 【发布时间】:2017-01-29 04:03:42 【问题描述】:

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

 
  "_id" : ObjectId("57e1ffcb94d9ae534869c6cd"), 
  "url" : "http://www.nytimes.com", 
  "verticals" : [ 1, 2, 3, 4, 5, 12 ] 

我想添加一个新字段,比如“numadx”,它是“verticals”数组的大小,在这种情况下,它是 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' 是 不适用于存储。”

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

非常感谢。

【问题讨论】:

【参考方案1】:

$addFields 是一个new feature in Mongo 3.4,它解决了这个问题: 它允许您通过将聚合的产品存储在记录中来更新集合的记录

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

【讨论】:

在 MongoDB 3.4 中,$out 阶段只能create a new collection or replace an existing one,因此这不是更新现有文档的可行解决方案。【参考方案2】:

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

更多信息,请参见:

javascript forEach method Write Scripts for the mongo Shell

【讨论】:

哦,谢谢,它运行顺利。哦,我看到我们不能在 update() 命令中使用 $size xD,非常感谢。 不要这样做。这对性能非常不利,并且可能导致竞争状况。 性能很差...【参考方案3】:

我不认为 $size 是 MongoDB 中的更新运算符。更新运算符是https://docs.mongodb.com/manual/reference/operator/update-field/。我从未见过 $size 除了在像这样的查找中使用过

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

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

【讨论】:

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

以上是关于添加新字段,它是文档另一个字段的大小[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用文档中另一个字段的值更新字段[重复]

MongoDb在并非所有文档中的字段上创建唯一索引[重复]

在猫鼬中更新它们时如何访问每个文档字段[重复]

Access 2010 报告问题:新页面顶部的重复字段

使用猫鼬生成自动增量字段?

氧气 - 高级自定义字段重复器子字段 - 链接字段