sql >> データベース >  >> NoSQL >> MongoDB

マングース:骨材を使用して一緒に見つける方法

    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. MongoDB $ acos

    2. mongodb-最も近い整数値を持つドキュメントを検索します

    3. MongoDBテキスト検索パフォーマンスの改善

    4. mongodbの利点はスキーマがないことであると想定されているのに、なぜmongooseはスキーマを使用するのですか?