MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB:trova i valori di campo dati del documento in un oggetto con una chiave sconosciuta

Anche se sembra che tu ti sia avvicinato a questa struttura a causa di un problema con gli aggiornamenti nell'uso di array nidificati, in realtà hai causato un altro problema solo facendo qualcos'altro che non è realmente supportato, e cioè che non c'è "carattere jolly" concetto per la ricerca di chiavi non specificate utilizzando gli operatori di query standard che sono ottimali.

L'unico modo in cui puoi davvero cercare tali dati è utilizzare il codice JavaScript sul server per attraversare le chiavi usando $where . Questa chiaramente non è una buona idea in quanto richiede forza bruta valutazione piuttosto che usare cose utili come un indice, ma può essere affrontato come segue:

db.theses.find(function() {
    var relations = this.relations;
    return Object.keys(relations).some(function(rel) {
        return relations[rel].type == "interpretation";
    });
))

Sebbene ciò restituirà quegli oggetti dalla raccolta che contengono il valore nidificato richiesto, deve ispezionare ogni oggetto nella raccolta per eseguire la valutazione. Questo è il motivo per cui tale valutazione dovrebbe essere utilizzata solo se abbinata a qualcosa che può utilizzare direttamente un indice invece come un valore reale dall'oggetto nella raccolta.

Tuttavia, la soluzione migliore è considerare la possibilità di rimodellare i dati per sfruttare gli indici nella ricerca. Laddove è necessario aggiornare le informazioni sulle "valutazioni", in pratica "appiattire" la struttura per considerare invece ogni elemento di "rating" come l'unico dato dell'array:

{
    "_id": "aeokejXMwGKvWzF5L",
    "text": "test",
    "relationsRatings": [
        {
            "relationId": "cF6iKAkDJg5eQGsgb",
            "type": "interpretation",
            "originId": "uFEjssN2RgcrgiTjh",
            "ratingId": 1,
            "ratingScore": 5
        },
        {
            "relationId": "cF6iKAkDJg5eQGsgb",
            "type": "interpretation",
            "originId": "uFEjssN2RgcrgiTjh",
            "ratingId": 2,
            "ratingScore": 6
        }
   ]
}

Ora la ricerca è ovviamente abbastanza semplice:

db.theses.find({ "relationsRatings.type": "interpretation" })

E ovviamente il posizionale $ operatore ora può essere utilizzato con la struttura più piatta:

db.theses.update(
    { "relationsRatings.ratingId": 1 },
    { "$set": { "relationsRatings.$.ratingScore": 7 } }
)

Ovviamente questo significa duplicazione dei dati "correlati" per ogni valore "rating", ma questo è generalmente il costo dell'aggiornamento in base alla posizione abbinata poiché questo è tutto ciò che è supportato solo con un singolo livello di annidamento dell'array.

Quindi puoi forzare la logica in modo che corrisponda al modo in cui l'hai strutturata, ma non è una buona idea farlo e porterà a problemi di prestazioni. Se tuttavia la tua esigenza principale qui è aggiornare le informazioni sulle "valutazioni" piuttosto che aggiungerle all'elenco interno, una struttura più piatta sarà di maggiore vantaggio e ovviamente sarà molto più veloce da cercare.