AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-5065577

Bogdan Dubyk's questions

Martin Hope
Bogdan Dubyk
Asked: 2024-01-04 00:39:23 +0800 CST

produtos de faceta TypeSense por categorias

  • 5

Sou um pouco novo no sentido de digitação, mas o que quero fazer é pegar todas as categorias com a quantidade de produtos de cada categoria, acho que isso pode ser feito com o uso de facet, certo?

Digamos que meu esquema de documento de produto seja assim:

{
   "name" : "products",
   "fields" : [
       {
           "name" : "id",
           "type" : "string"
       },
       {
           "name": "name",
           "type": "string"
       }, 
       {
           "name": "categories",
           "type": "object[]",
           "facet": true,
           "fields" : [
               {
                   "name":"id",
                   "type": "string"
               },
               {
                   "name":"label",
                   "type": "string"
               }
           ]
       },
       {
           "name": "options",
           "type": "string[]",
           "facet": true
       }
      
   ] 
}

então aqui cada produto pode pertencer a uma ou várias categorias (se a categoria do produto pertencer for uma subcategoria, isso significa que o produto também pertence à categoria pai) e o categoriescampo definido como facetdesejo obter todas as categorias com a quantidade de produtos em cada .

Quando estou executando uma consulta de pesquisa como esta:

client.collections('products').documents().search(
   {
      "q" : "*",
      "facet_by" : "categories.id",
      "per_page" : 0 # I do not need products just the facet part
   }
)

O TypeSense retorna campos aleatórios de 9 facetas como este:

"facet_counts" => array:1 [
    0 => array:4 [
      "counts" => array:10 [
        0 => array:3 [
          "count" => 106581
          "highlighted" => "ab58454c-def8-431f-ad78-b435e390d095"
          "value" => "ab58454c-def8-431f-ad78-b435e390d095"
        ]
        1 => array:3 [
          "count" => 106580
          "highlighted" => "1b4dfa36-c66d-4cc0-a61d-3fee6b878299"
          "value" => "1b4dfa36-c66d-4cc0-a61d-3fee6b878299"
        ]
        2 => array:3 [
          "count" => 106550
          "highlighted" => "fe1633c0-7cd6-4f7c-88ed-f6b9de34d94d"
          "value" => "fe1633c0-7cd6-4f7c-88ed-f6b9de34d94d"
        ]
        3 => array:3 [
          "count" => 106547
          "highlighted" => "9e794fee-b3fd-4f83-a41c-cbf629bec8cf"
          "value" => "9e794fee-b3fd-4f83-a41c-cbf629bec8cf"
        ]
        4 => array:3 [
          "count" => 106543
          "highlighted" => "b94f2647-f850-48b3-861e-d9fd97cfe577"
          "value" => "b94f2647-f850-48b3-861e-d9fd97cfe577"
        ]
        5 => array:3 [
          "count" => 106542
          "highlighted" => "96e281f4-3f63-411a-a517-0250e2491cf5"
          "value" => "96e281f4-3f63-411a-a517-0250e2491cf5"
        ]
        6 => array:3 [
          "count" => 106530
          "highlighted" => "455a8b50-2dc5-4683-837e-8119217b9ee1"
          "value" => "455a8b50-2dc5-4683-837e-8119217b9ee1"
        ]
        7 => array:3 [
          "count" => 106523
          "highlighted" => "7215ec95-db47-4c90-b915-349fa05191d1"
          "value" => "7215ec95-db47-4c90-b915-349fa05191d1"
        ]
        8 => array:3 [
          "count" => 106507
          "highlighted" => "59171caf-cc00-4b7b-92dd-0da54b925a95"
          "value" => "59171caf-cc00-4b7b-92dd-0da54b925a95"
        ]
        9 => array:3 [
          "count" => 106506
          "highlighted" => "4128454d-2c26-4ed4-b194-021426a5f99e"
          "value" => "4128454d-2c26-4ed4-b194-021426a5f99e"
        ]
      ]
      "field_name" => "categories.id"
      "sampled" => false
      "stats" => array:1 [
        "total_values" => 1696
      ]
    ]
  ]

mas na coleção tem muito mais categorias, o que estou fazendo de errado? Como posso obter todas as categorias com quantidades de produtos ou não é possível com facetas?

UPD: Também tenho a opção de uma lista de IDs de filtros relacionados ao produto e quero uma consulta separada para fazer o mesmo (obter todos os filtros com quantidades de produtos). Provavelmente é outra história, apenas explicando por que ela está lá.

typesense
  • 1 respostas
  • 16 Views
Martin Hope
Bogdan Dubyk
Asked: 2023-12-22 00:57:15 +0800 CST

Como fazer um índice de cobertura total no mongo

  • 6

Digamos que eu tenha um documento com esta estrutura:

_id: ObjectId,
user_id: int,
deleted: bool,
'additional.id': string, // optional field
synced_at: Date //optional field

documento de exemplo será:

{
    "_id" : ObjectId("5dce551d6ad5bb1fd829bd77"),
    "user_id" : NumberInt(1),
    "additional" : {
        "id" : "hahahah"
    },
    "deleted" : false,
    "synced_at" : ISODate("2023-12-19T19:21:26.678+0000")
}

e preciso contar todos os documentos que correspondem a esta consulta:

aggregate(
[
    {
        $match: {
             user_id: 1, 
             deleted: false,
  
             "additional.id" : {$exists : true},
             synced_at : {
                 $gte: new Date(new Date() - 7 * 60 * 60 * 24 * 1000)
             },
        }
    }
    ,
    {
        $count : "productsCount"
    }
]
)

Então criei um índice como este:

createIndex(
  {
      "user_id": 1,
      "deleted": 1,
      "additional.id": 1,
      "synced_at": -1,
  },
  {
      partialFilterExpression: {
        "deleted" : false,
        "additional.id" : {
            "$exists" : true
        },
        "synced_at" : {
            "$exists" : true
        }
    }
)

e digamos que o resultado da consulta seja 20.000. Quando executo uma consulta, .explain("executionStats")posso ver isso totalKeysExaminede totalDocsExaminedambos são iguais a 20.000, e se não me engano, significa que 20 mil produtos foram retirados do índice e, além disso, o mongo fez uma pesquisa sobre todos esses 20 mil produtos. Verificando mais profundamente as estatísticas de execução, posso ver Fetcho estágio no topo do índice:

"executionStages" : {
    "stage" : "FETCH",
    "filter" : {
        "$and" : [
           {
               "additiona.id" : {
                   "$exists" : true
                }
            ,
        ]
    },

Então, novamente, se não me engano, isso significa que o Mongo pega todos os documentos necessários (20k) do índice, mas por algum motivo verifica adicionalmente cada um dos 20k produtos, mesmo "additiona.id" : {"$exists" : true}que já esteja empartialFilterExpression

Posso evitar esse estágio de busca de alguma forma? Estou no Mongo 5.

mongodb
  • 1 respostas
  • 25 Views
Martin Hope
Bogdan Dubyk
Asked: 2023-08-24 23:09:39 +0800 CST

Consulta Mongo para obter documentos onde o campo não existe, nulo, objeto vazio {} ou matriz vazia []

  • 5

digamos que eu tenha 7 documentos como este:

// with content.id
{
   "_id" : 1, // I know it will be ObjectId but for simplicity here I'll set it as int
   "content" : {"id" : 1, "title" : "some title"}
}
// without content.id
{
   "_id" : 2,
   "content" : {"title" : "some title"}
}
// with content.id equal to null
{
   "_id" : 3,
   "content" : {"id" : null, "title" : "some title"}
}
// with empty content object
{
   "_id" : 4,
   "content" : {}
}
// with content as an empty array
{
   "_id" : 5,
   "content" : []
}
// with content equal to null
{
   "_id" : 6,
   "content" : null
}
// without content
{
   "_id" : 7,
}

e preciso pegar todos os registros onde não temos content.idno nosso caso todos os registros exceto o registro 1.

Eu tentei com

collection.find({"content.id" : null});  

e não retorna o registro 1 que está correto mas também não retorna o registro com id 5, onde contentestá definido como um array vazio

também, tentei com

collection.find({"content.id" : {"$exists" : false}});  

nesse caso, ele retorna o registro com id 5, mas não retorna o registro com id 3, onde content.idexiste mas está definido como nulo.

Descobri que a consulta pode funcionar com uma combinação de ambos, assim

collection.find({ "$or" : [{"content.id" : {"$exists" : false}} , {"content.id" : null}]});  

mas essa consulta funciona um pouco mais devagar :(

Existe maneira melhor de cobrir todos os casos descritos acima?

Você pode perguntar por que quero cobrir ambos content: {}e content: []? porque o PHP às vezes converte um array vazio em um objeto, mas às vezes em um array vazio, para não ter problemas, quero cobrir os dois casos.

mongodb
  • 1 respostas
  • 13 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve