MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB:Encontre os valores de campo fornecidos pelo documento em um objeto com uma chave desconhecida


Embora você pareça ter abordado essa estrutura devido a um problema com atualizações no uso de matrizes aninhadas, você realmente só causou outro problema fazendo outra coisa que não é realmente suportada, e é que não há "curinga" conceito para pesquisar chaves não especificadas usando os operadores de consulta padrão que são ideais.

A única maneira de realmente pesquisar esses dados é usando o código JavaScript no servidor para percorrer as chaves usando $where . Isso claramente não é uma boa ideia, pois requer força bruta avaliação em vez de usar coisas úteis como um índice, mas pode ser abordado da seguinte forma:
db.theses.find(function() {
    var relations = this.relations;
    return Object.keys(relations).some(function(rel) {
        return relations[rel].type == "interpretation";
    });
))

Embora isso retorne os objetos da coleção que contêm o valor aninhado necessário, ele deve inspecionar cada objeto na coleção para fazer a avaliação. É por isso que tal avaliação deve realmente ser usada apenas quando emparelhada com algo que pode usar diretamente um índice em vez de um valor rígido do objeto na coleção.

Ainda assim, a melhor solução é considerar a remodelação dos dados para aproveitar os índices na pesquisa. Onde for necessário atualizar as informações de "classificações", basicamente "achatar" a estrutura para considerar cada elemento de "classificação" como os únicos dados de matriz:
{
    "_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
        }
   ]
}

Agora, a pesquisa é, obviamente, bastante simples:
db.theses.find({ "relationsRatings.type": "interpretation" })

E, claro, o $ posicional operador agora pode ser usado com a estrutura mais plana:
db.theses.update(
    { "relationsRatings.ratingId": 1 },
    { "$set": { "relationsRatings.$.ratingScore": 7 } }
)

É claro que isso significa duplicação dos dados "relacionados" para cada valor de "classificações", mas geralmente é o custo de atualizar por posição correspondente, pois isso é tudo o que é suportado apenas com um único nível de aninhamento de matriz.

Assim, você pode forçar a lógica a combinar com a maneira como ela foi estruturada, mas não é uma boa ideia fazer isso e levará a problemas de desempenho. Se, no entanto, sua principal necessidade aqui for atualizar as informações de "classificações" em vez de apenas anexar à lista interna, uma estrutura mais plana será de maior benefício e, claro, será muito mais rápida de pesquisar.