MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Mongoose wybierz poddokumenty

W ten sposób MongoDB obsługuje podstawową projekcję z elementami tablicy. Chociaż możesz zrobić coś takiego:

Model.findOne({}, { "comments.upvotes": 1 },function(err,doc) {

})

A to po prostu zwróciłoby pole „upvotes” z poddokumentów tablicy komentarzy dla wszystkich dokumentów spełniających warunek i wszystkich elementów tablicy, oczywiście nie można połączyć tego z wybraną projekcją pozycyjną za pomocą pozycyjny $ operator. Wynika to zasadniczo z "teorii" że ogólnie faktycznie chcesz zwrócić całą tablicę. Tak to zawsze działało i prawdopodobnie wkrótce się nie zmieni.

Aby uzyskać to, czego chcesz, potrzebujesz rozszerzonych możliwości manipulacji dokumentami oferowanych przez struktura agregacji . Daje to większą kontrolę nad sposobem zwracania dokumentów:

Model.aggregate(
    [
        // Match the document containing the array element
        { "$match": { "comments._id" : oid } },

        // Unwind to "de-normalize" the array content
        { "$unwind": "$comments" },

        // Match the specific array element
        { "$match": { "comments._id" : oid } },

        // Group back and just return the "upvotes" field
        { "$group": {
            "_id": "$_id",
            "comments": { "$push": { "upvotes": "$comments.upvotes" } }
        }}
    ],
    function(err,docs) {


    }
);

Lub w nowoczesnych wersjach MongoDB od 2.6 możesz nawet to zrobić:

Model.aggregate(
    [
        { "$match": { "comments._id" : oid } },
        { "$project": {
            "comments": {
                "$setDifference": [
                    { "$map": {
                        "input": "$comments",
                        "as": "el",
                        "in": {
                            "$cond": [
                                { "$eq": [ "$$el._id", oid ] },
                                { "upvotes": "$$el.upvotes" },
                                false
                            ]
                        }
                    }},
                    [false]
                ]
            }}
        }}
    ],
    function(err,docs) {

    }
)

I to używa $map i $setDifference operatorów do filtrowania zawartości tablicy bez uprzedniego przetwarzania $unwind scena.

Jeśli więc chcesz mieć większą kontrolę nad sposobem zwracania dokumentu, podczas pracy z osadzonymi dokumentami najlepszym rozwiązaniem jest struktura agregacji.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Niekończące się odzyskiwanie stanu wtórnego

  2. Jak ponownie wykorzystać połączenie mongodb za pośrednictwem Promise

  3. MongoDB:powolne wyszukiwanie potoku wydajności w porównaniu z wyszukiwaniem podstawowym

  4. MongoDB $milisekundy

  5. Jak zachować agregację dokumentów za pomocą $unwind