sql >> Databasteknik >  >> NoSQL >> MongoDB

Projektionsmöjlighet för att returnera fältets längd/storlek

.find() "ändrar" inte dokument som returneras på något sätt. Du kan bara "inkludera" eller "utesluta" i projektion.

Det enda som "ändrar" är .aggregate() eller .mapReduce() .

För .aggregate() , kräver MongoDB 3.4 för $strLenCP eller $strLenBytes , men vanligtvis menar du det förra:

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

För .mapReduce()

db.documents.mapReduce(
  function() {
    emit(this._id, this.body.length)
  },
  function() { },
  { "out": { "inline": 1 } }
);

Och realistiskt sett i det senare fallet kan du lika gärna iterera markören och kan behöva om inte samlingen är tillräckligt liten eller om du faktiskt kan mata ut till en annan samling istället.

$size operatorn du försöker använda gäller endast "arrayer" för att returnera antalet poster som finns. Och återigen, det är bara giltigt för användning med .aggregate() metod.

Om du menar att utelämna tecken som ett space inom en sträng och sedan en $split och $reduce med $concat kan tillämpas:

db.documents.aggregate([
  { "$addFields": {
    "bodyLength": {
      "$strLenCP": {
        "$reduce": {
          "input": { "$split": [ "$name", " "] },
          "initialValue": "",
          "in": { "$concat": [ "$$value", "$$this" ] }
        }
      }
    }
  }}
])

Eller igen med mapReduce() :

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 } }
);



  1. Försöker starta redis och resque schemaläggaren inom en rake-uppgift

  2. Ställ in standarddatum i Mongoose-dokumentet till nu + [någon ökning]

  3. blpop slutar bearbeta kön efter ett tag

  4. Hur använder man $elemMatch på aggregatets projektion?