sql >> Database >  >> NoSQL >> MongoDB

Mongoose:hoe aggregaat gebruiken en samen zoeken

Gebruik voor MongoDB 3.6 en hoger de $expr operator die het gebruik van aggregatie-expressies binnen de zoektaal toestaat:

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

Voor niet-compatibele versies kunt u zowel de $match en $redact pijplijnen om uw verzameling te doorzoeken. Als u bijvoorbeeld de locations . wilt opvragen collectie waarbij de naam 'ontwikkeling' en followers_count . is groter is dan 30, voert u de volgende aggregatiebewerking uit:

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

of binnen een enkele pijplijn 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);
})

Het bovenstaande retourneert de locaties met alleen de _id referenties van de gebruikers. Als u de gebruikersdocumenten wilt retourneren als middel om de array met volgers te "vullen", kunt u de $lookup pijpleiding.

Als de onderliggende Mongo-serverversie 3.4 en nieuwer is, kunt u de pijplijn uitvoeren 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);
})

anders moet je $unwind de volgers-array voor het toepassen van $lookup en hergroepeer vervolgens met $group pijplijn daarna:

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


  1. Zoek een locatie binnen een opgeslagen cirkel

  2. Hoe gebruik ik een guid in een mongodb-shellquery?

  3. Groeperen op verschillende velden

  4. Mongo DB:laat alle documenten invoegen na de laatst bekende