7

Wie kann ich aggregate und find zusammen in Mongoose verwenden?
das heißt ich habe folgendes Schema:Mungo: wie aggregieren und finden zusammen

const schema = new Mongoose.Schema({ 
    created: { type: Date, default: Date.now() }, 
    name: { type: String, default: 'development' } 
    followers: [{ type: Mongoose.Schema.ObjectId, ref: 'Users'}] 
... 
}) 

export default Mongoose.model('Locations', schema) 

Wie kann ich die Benutzer nur mit den Feldern name und followers_count abfragen.
followers_count: die Länge von followers.

Dort weiß ich, wir können select verwenden, um nur das Feld name zu erhalten.
Wie können wir die Anzahl von followers bekommen?

Antwort

7

Für MongoDB 3.6 und höher, verwenden Sie die $expr Operator, der die Verwendung von Aggregations Ausdrücke in der Abfragesprache erlaubt:

var followers_count = 30; 
db.locations.find({ 
    "$expr": { 
     "$and": [ 
      { "$eq": ["$name", "development"] }, 
      { "$gte": [{ "$size": "$followers" }, followers_count ]} 
     ] 
    } 
}); 

Für nicht-kompatible Versionen können Sie verwenden, um sowohl die $match und $redact Pipelines, um Ihre Sammlung abzufragen. Zum Beispiel, wenn Sie die locations Sammlung, wo der Name abfragen wollen, ist ‚Entwicklung‘ und followers_count größer als 30, den folgenden Aggregatbetrieb laufen:

const followers_count = 30; 
Locations.aggregate([ 
    { "$match": { "name": "development" } }, 
    { 
     "$redact": { 
      "$cond": [ 
       { "$gte": [ { "$size": "$followers" }, followers_count ] }, 
       "$$KEEP", 
       "$$PRUNE" 
      ] 
     } 
    } 
]).exec((err, locations) => { 
    if (err) throw err; 
    console.log(locations); 
}) 

oder innerhalb einer einzelnen Pipeline als

Locations.aggregate([ 
    { 
     "$redact": { 
      "$cond": [ 
       { 
        "$and": [ 
         { "$eq": ["$name", "development"] }, 
         { "$gte": [ { "$size": "$followers" }, followers_count ] } 
        ] 
       }, 
       "$$KEEP", 
       "$$PRUNE" 
      ] 
     } 
    } 
]).exec((err, locations) => { 
    if (err) throw err; 
    console.log(locations); 
}) 

Das obige gibt die Standorte mit nur den _id Referenzen von den Benutzern zurück. Um die Benutzerdokumente zurückzugeben, um das Follower-Array zu "füllen", können Sie die Pipeline an die $lookup Pipeline anhängen.


Wenn die zugrunde liegende Version Mongo Server 3.4 und höher ist, können Sie die Pipeline als

let followers_count = 30; 
Locations.aggregate([ 
    { "$match": { "name": "development" } }, 
    { 
     "$redact": { 
      "$cond": [ 
       { "$gte": [ { "$size": "$followers" }, followers_count ] }, 
       "$$KEEP", 
       "$$PRUNE" 
      ] 
     } 
    }, 
    { 
     "$lookup": { 
      "from": "users", 
      "localField": "followers", 
      "foreignField": "_id", 
      "as": "followers" 
     } 
    } 
]).exec((err, locations) => { 
    if (err) throw err; 
    console.log(locations); 
}) 

sonst laufen Sie $unwind die Anhänger Array vor der Anwendung $lookup benötigen würde und dann neu formieren mit $group pipeline danach:

let followers_count = 30; 
Locations.aggregate([ 
    { "$match": { "name": "development" } }, 
    { 
     "$redact": { 
      "$cond": [ 
       { "$gte": [ { "$size": "$followers" }, followers_count ] }, 
       "$$KEEP", 
       "$$PRUNE" 
      ] 
     } 
    }, 
    { "$unwind": "$followers" }, 
    { 
     "$lookup": { 
      "from": "users", 
      "localField": "followers", 
      "foreignField": "_id", 
      "as": "follower" 
     } 
    }, 
    { "$unwind": "$follower" }, 
    { 
     "$group": { 
      "_id": "$_id", 
      "created": { "$first": "$created" }, 
      "name": { "$first": "$name" }, 
      "followers": { "$push": "$follower" } 
     } 
    } 
]).exec((err, locations) => { 
    if (err) throw err; 
    console.log(locations); 
}) 
4

Sie können wie folgt verwendet werden:

db.locations.aggregate([ 
    {$match:{"your find query"}}, 
    {$project:{"your desired fields"}} 
]) 

Im Spiel Sie solche Sachen tun:

{{$match:{name:"whatever"}} 

Im Projekt können Sie die Felder auswählen, die Sie mögen, mit Zahlen 0 oder 1 wie:

{$project:{_id:1,created:0,name:1}} 

Welche 0 bedeutet, nicht setzen und 1 bedeutet setzen.