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

Je možné použít projekci dotazu na stejnou kolekci, která má projekci $elemMatch?

Ano, existují dva způsoby, jak to udělat. Můžete tedy buď použít $elemMatch na projekční straně jako již máte, s malými změnami:

Model.findById(id,
   { "comments": { "$elemMatch": {"created.by": "Jane" } } },
   function(err,doc) {

Nebo stačí přidat do části dotazu a použít poziční $ operátor:

Model.findOne(
    { "_id": id, "comments.created.by": "Jane" },
    { "comments.$": 1 },
    function(err,doc) {

Oba způsoby jsou naprosto platné.

Pokud byste chtěli něco trochu obsáhlejšího, můžete použít .aggregate() metoda a je to $project operátor místo toho:

Model.aggregate([
    // Still match the document
    { "$match": "_id": id, "comments.created.by": "Jane" },

    // Unwind the array
    { "$unwind": "$comments" },

    // Only match elements, there can be more than 1
    { "$match": "_id": id, "comments.created.by": "Jane" },

    // Project only what you want
    { "$project": {
        "comments": {
            "body": "$comments.body",
            "by": "$comments.created.by"
        }
    }},

    // Group back each document with the array if you want to
    { "$group": {
        "_id": "$_id",
        "comments": { "$push": "$comments" }
    }}
],
function(err,result) {

Takže agregační rámec lze použít pro mnohem více než jen pro agregaci výsledků. Je to $project operátor vám poskytuje větší flexibilitu, než je dostupná pro projekci pomocí .find() . Umožňuje také filtrovat a vracet více výsledků pole, což je také něco, co nelze provést s projekcí v .find() .




  1. Export system.profile z MongoDB nefunguje

  2. Jak bych mohl zapsat objekt BsonDocument do souboru a znovu jej přečíst pomocí Javy

  3. Nelze se připojit k místnímu (běžícímu) mongo pomocí „meteor mongo“

  4. Jak používáte arrayFilters s mongoose 5.x.x?