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

単純な値またはリストのMongoでの動的スティッキーソート

    エラーを再現することはできませんが、質問にいくつかの「タイプミス」があるため、実際に何が発生しているかわかりません。

    ただし、実際にMongoDB 2.6以降を使用していると仮定すると、おそらくが必要になります。 $ setIntersection または $ setIsSubset $ setUnionではなく演算子 。これらの演算子は、比較対象の配列の「一致する」コンテンツを意味します。ここで、 $ setUnion 提供されたアレイを既存のアレイと組み合わせるだけです:

    db.people.aggregate([
        { "$project": {
            "first_name": 1,
            "last_name": 1,
            "sticky": { 
                "$size": { 
                    "$setIntersection": [ "$offices", [ "FL", "SC" ]] 
                }
            },
            "offices": 1
        }},
        { "$sort": {
            "sticky": -1,
            "last_name": 1
        }}
    ])
    

    集合演算子 がない以前のバージョンでは $ unwindを使用しているだけです アレイを操作するには、同じ種類の $ cond $ group> すべてを元に戻すには:

    db.people.aggregate([
        { "$unwind": "$offices" },
        { "$group": {
            "_id": "$_id",
            "first_name": { "$first": "$first_name" },
            "last_name": { "$first": "$last_name",
            "sticky": { "$sum": { "$cond": [
                { "$or": [
                    { "$eq": [ "$offices": "FL" ] },
                    { "$eq": [ "$offices": "SC" ] },
                ]},
                1,
                0
            ]}},
            "offices": { "$push": "$offices" }
        }},
        { "$sort": {
            "sticky": -1,
            "last_name": 1
        }}
    ])
    

    しかし、あなたは確かに正しい方向に進んでいました。正確なニーズを得るには、適切なセット操作またはその他の方法を選択するだけです。

    または、必要なものを取得する方法を投稿したので、そのような「順序付きマッチング」を作成するためのより良い方法は次のとおりです。

    db.people.aggregate([
        { "$project": {
            "first_name": 1,
            "last_name": 1,
            "sticky": { "$cond": [
                { "$anyElementTrue": {
                    "$map": {
                        "input": "$offices",
                        "as": "o",
                        "in": { "$eq": [ "$$o", "FL" ] }
                    }
                }},
                2,
                { "$cond": [
                    { "$anyElementTrue": {
                        "$map": {
                            "input": "$offices",
                            "as": "o",
                            "in": { "$eq": [ "$$o", "SC" ] }
                        }
                    }},
                    1,
                    0
                ]}
            ]},
            "offices": 1
        }},
        { "$sort": {
            "sticky": -1,
            "last_name": 1
        }}
    ])
    

    そして、それは、「SC」よりも「FL」を含む「オフィス」、したがって他のすべてのドキュメントよりも優先され、単一のフィールド内で操作を実行します。また、 $ unwind 集合演算子のない以前のバージョンでは。 $ cond ステートメント。



    1. Mongodbのマルチネスト配列を更新します

    2. スレッドメインjava.lang.NoClassDefFoundErrorでjava例外があるMongoDB:org / bson / Conversions / Bson

    3. レプリカセットではなくスタンドアロンmongodでoplogを有効にする

    4. MongoDBで1970年より前の日付を処理する方法