sql >> Databáze >  >> NoSQL >> MongoDB

Najít prvek na základě dvou hodnot

Z dříve propojeného dupe (možné) , řešení využívající $where bude následovat:

db.collection.find({
    "$where": function() {
        self = this;
        return this.actors.filter(function(actor) {
            return self.director._id === actor._id;
        }).length > 0
    }
})

A druhý navrhovaný přístup, který používá agregační rámec $redact potrubí:

db.collection.aggregate([
    { 
        "$redact": { 
            "$cond": [
                { 
                    "$setIsSubset": [ 
                        ["$director._id"], 
                        {
                            "$map": {
                                "input": "$actors",
                                "as": "el",
                                "in": "$$el._id"
                            }
                        }
                    ] 
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

Výše uvedená logika podmínek pro $redact se provádí pomocí operátorů množin $setIsSubset a $map .

$map operátor vrátí pole pouze s id aktéra z actors pole po použití výrazu na každý prvek v poli. Takže například výraz

{
    "$map": {
        "input": "$actors",
        "as": "el",
        "in": "$$el._id"
    }
}

pokud se použije na pole aktérů

[ 
    {
        "_id" : "artist:3",
        "first_name" : "James",
        "last_name" : "Stewart",
        "birth_date" : "1908",
        "role" : "John Ferguson"
    }, 
    {
        "_id" : "artist:16",
        "first_name" : "Kim",
        "last_name" : "Novak",
        "birth_date" : "1925",
        "role" : "Madeleine Elster"
    }, 
    {
        "_id" : "artist:282",
        "first_name" : "Arthur",
        "last_name" : "Pierre",
        "birth_date" : null,
        "role" : null
    }
]

vrátí

[ "artist:3", "artist:16", "artist:282" ]

Tento výsledek je porovnán s polem jednoho prvku ["$directors._id"] pomocí $setIsSubset operátor, který vezme dvě pole a vrátí hodnotu true, když je první pole podmnožinou druhého pole, včetně případů, kdy se první pole rovná druhému poli, a jinak hodnotu false.

Například,

{ 
    "$setIsSubset": [ 
        [ "artist:12" ], 
        [ "artist:3", "artist:16", "artist:282" ] 
    ] 
}       // false

{ 
    $setIsSubset: [ 
        [ "artist:282" ], 
        [ "artist:3", "artist:16", "artist:282" ] 
    ] 
}       // true

Booleovský výsledek od operátora se pak použije jako základ pro $redact potrubí.

Vysvětlení výkonu stále platí:$where je dobrý hack, když je to nutné, ale měli byste se mu vyhnout, kdykoli je to možné.



  1. Mongoose přidat více položek do databáze

  2. Existuje nějaké omezení počtu argumentů, které zvládnou příkazy redis, jako je ZADD nebo HMGET?

  3. Mongo rozhraní

  4. 7 způsobů, jak zkontrolovat verzi MongoDB