MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongoose:как да използвате агрегат и да намерите заедно

За MongoDB 3.6 и по-нови, използвайте $expr оператор, който позволява използването на агрегиращи изрази в рамките на езика на заявката:

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

За несъвместими версии можете да използвате както $match и $redact тръбопроводи за запитване към вашата колекция. Например, ако искате да направите заявка за locations колекция, където името е 'development' и followers_count е по-голямо от 30, изпълнете следната обобщена операция:

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

или в рамките на един конвейер като

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

Горното ще върне местоположенията само с _id препоръки от потребителите. За да върнете документите на потребителите като средство за „попълване“ на масива за последователи, след това можете да добавите $lookup тръбопровод.

Ако основната версия на Mongo сървъра е 3.4 или по-нова, можете да стартирате конвейера като

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

в противен случай ще трябва да $unwind масива последователи, преди да приложите $lookup и след това прегрупирайте с $group тръбопровод след това:

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Фатална грешка в черния списък на MongoDB

  2. MongoDb заявка за сума

  3. Избутване на елемент в масив, който е ключът на друг обект на определена позиция

  4. Как да прочетете конкретна двойка ключ-стойност от колекция mongodb

  5. Трябва ли да използвам разреден индекс за булеви флагове в mongodb?