sql >> Databáze >  >> NoSQL >> MongoDB

Možnost promítání vrátit délku/velikost pole

.find() vrácené dokumenty žádným způsobem „nemění“. V projekci můžete pouze "zahrnout" nebo "vyloučit".

Jediné věci, které se „mění“, jsou .aggregate() nebo .mapReduce() .

Pro .aggregate() , vyžaduje MongoDB 3.4 pro $strLenCP nebo $strLenBytes , ale obvykle máte na mysli první:

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

Pro .mapReduce()

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

A realisticky ve druhém případě můžete také iterovat kurzor a možná to budete muset udělat, pokud není kolekce dostatečně malá nebo pokud místo toho nemůžete skutečně vystupovat do jiné kolekce.

$size Operátor, který se pokoušíte použít, se vztahuje pouze na "pole", aby vrátil počet přítomných položek. A opět platí pouze pro použití s ​​.aggregate() metoda.

Pokud chcete vynechat znaky, jako je space v řetězci pak $split a $reduce s $concat lze použít:

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

Nebo znovu pomocí 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. Výplň v SQL

  2. Spring Data MongoDB:Převod BigInteger na ObjectId

  3. Zálohování a obnovení MongoDB pomocí MongoDump

  4. MongoDB:připojení k aplikaci ASP.NET MVC