Mongodb 用于返回字段长度/大小的投影选项

Mongodb 用于返回字段长度/大小的投影选项,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我只是想编写一个mongo查询,如SQL中的: SELECT LENGTH(binaryBody) AS bodyLength FROM documents; 为此,我想我必须使用find方法的投影 db.documents.find( {<query>}, { bodyLength: {$size: 'body'}} ); db.documents.find( {}, {bodyLength:{$size:'body'} ); 但如何做到这一点呢 错误:错误: {“w

我只是想编写一个mongo查询,如SQL中的:

SELECT LENGTH(binaryBody) AS bodyLength FROM documents;
为此,我想我必须使用find方法的投影

db.documents.find(
  {<query>},
  { bodyLength: {$size: 'body'}}
);
db.documents.find(
{},
{bodyLength:{$size:'body'}
);
但如何做到这一点呢

错误:错误: {“waitedMS”:NumberLong(0),“ok”:0,“errmsg”:

“不支持的投影选项:bodyLength:{$size:\'body\'}”, “代码”:2}

.find()
不会以任何方式“更改”返回的文档。只能在投影中“包含”或“排除”

唯一“改变”的是或

对于
.aggregate()
,要求或使用MongoDB 3.4,但通常指前者:

db.documents.aggregate([
  { "$project": {
    "bodyLength": { "$strLenCP": "$body" }
  }}
])
对于
.mapReduce()

实际上,在后一种情况下,您可能需要迭代光标,除非集合足够小,或者您可以实际输出到另一个集合

您尝试使用的运算符仅适用于“数组”以返回当前的条目数。同样,它仅适用于
.aggregate()
方法

如果要省略字符串中的字符,如
空格
,则可以应用and with:

db.documents.aggregate([
  { "$addFields": {
    "bodyLength": {
      "$strLenCP": {
        "$reduce": {
          "input": { "$split": [ "$name", " "] },
          "initialValue": "",
          "in": { "$concat": [ "$$value", "$$this" ] }
        }
      }
    }
  }}
])
或者再次使用
mapReduce()

db.documents.aggregate([
  { "$addFields": {
    "bodyLength": {
      "$strLenCP": {
        "$reduce": {
          "input": { "$split": [ "$name", " "] },
          "initialValue": "",
          "in": { "$concat": [ "$$value", "$$this" ] }
        }
      }
    }
  }}
])
db.documents.mapReduce(
  function() {
    emit(this._id, "".concat.apply(this.body.split(" ")).length)
    // Or even
    // emit(this._id, this.body.split(" ").reduce((o,e) => o.concat(e),"").length)
  },
  function() { },
  { "out": { "inline": 1 } }
);