sql >> Database teknologi >  >> NoSQL >> MongoDB

Projektionsmulighed for at returnere længde/størrelse af felt

.find() "ændrer" ikke returnerede dokumenter på nogen måde. Du kan kun "inkludere" eller "udelukke" i projektion.

De eneste ting, der "ændrer" er .aggregate() eller .mapReduce() .

For .aggregate() , kræver MongoDB 3.4 til $strLenCP eller $strLenBytes , men normalt mener du førstnævnte:

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

For .mapReduce()

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

Og realistisk set i sidstnævnte tilfælde kan du lige så godt gentage markøren, og det kan være nødvendigt, medmindre samlingen er lille nok, eller du faktisk kan udskrive til en anden samling i stedet for.

$size operator du forsøger at bruge gælder kun for "arrays" for at returnere antallet af tilstedeværende poster. Og igen, det er kun gyldigt til brug med .aggregate() metode.

Hvis du mener at udelade tegn såsom et space inden for en streng og derefter en $split og $reduce med $concat kan anvendes:

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. Sådan MongoDB aggregering i Node.js

  2. Sådan gemmer du kun datodelen med mongoose, ikke i ISODate-format

  3. Mongoose-detekteringsdatabase er ikke klar

  4. Mongoose aggregering med geonear