【问题标题】:what is the best approach to query custom customer data. MongoDB / ElasticSearch查询自定义客户数据的最佳方法是什么。 MongoDB / 弹性搜索
【发布时间】:2013-02-28 15:26:08
【问题描述】:

我正在做一个客户可以发送自定义数据的应用程序,并且这个自定义数据应该是“可查询的”,我的意思是客户可以搜索这些字段。

为以下用户发送的数据:

data = {
  name: "Thiago",
  id: 2093  
  country: "Portugal",
  custom_data: {
    company: "foo",
     plan: "pro",
     department: "it",
     sessions: 203 
  }
}

由于应用程序无方案的要求,我们正在使用 mongoDB 来持久化数据。

但是,我想知道如何查询这些自定义数据?我们没有这些字段的索引,并且有很多文档 ~ 1.3M。

我认为使用 elasticsearch 我们可以处理这个要求,但是有没有不使用它的好方法?只使用 mongodb 吗?

一个查询示例可能是:

查找所有来自葡萄牙的信息,并拥有 100 多个登录信息。

提前致谢

【问题讨论】:

  • 您有任意文档和任意查询?如果是这样,那么每次执行查询都会很慢,因为每个文档都需要扫描。即使所有内容都在内存中,不幸的是,如果没有索引,这也不会快速或高效。
  • @WiredPrairie 对。我使用弹性搜索来索引我的文档。每个租户都会在 ES 中拥有自己的索引。我想知道这种方法是否正确,您怎么看? elasticsearch 是这种场景的好方法吗?
  • 鉴于您需要数据类型 (>100) 并且您不能为每个组合创建索引(因为每个集合最多有 64 个索引,建议定期保持在 16 以下),我可以没有看到在 MongoDB 中对此进行建模的有效/合乎逻辑的方法。可能有,但不是很明显。
  • @WiredPrairie 是的!将 ES 与自定义字段的自动映射一起使用怎么样?这样,我认为比为所有字段创建一个索引/组合要好得多。
  • 我从未使用过 ES,因此无法提供任何指导。

标签: mongodb full-text-search elasticsearch


【解决方案1】:

您可以将要动态查询的数据存储为“类型化”键值对数组,如下所示:

 query_data: [
    { type: "company", value: "foo" },
    { type: "plan", value: "pro" },
    ... 
  ]

然后索引 .type 和 .value

以您的示例为例,如下所示:

> db.xx.findOne()
{
    "_id" : ObjectId("515ca2bc57a0887a97cc8d14"),
    "name" : "Thiago",
    "id" : 2093,
    "country" : "Portugal",
    "custom_data" : [
        {
            "type" : "company",
            "value" : "foo"
        },
        {
            "type" : "plan",
            "value" : "pro"
        },
        {
            "type" : "department",
            "value" : "it"
        },
        {
            "type" : "sessions",
            "value" : 203
        }
    ]
}
> db.xx.ensureIndex({country:1,"custom_data.type":1,"custom_data.value":1})
> db.xx.find({country:"Portugal","custom_data.type":"sessions","custom_data.value":{$gt:100}}).explain()
{
    "cursor" : "BtreeCursor country_1_custom_data.type_1_custom_data.value_1",
    "isMultiKey" : true,
    "n" : 1,
    "nscannedObjects" : 1,
    "nscanned" : 1,
    "nscannedObjectsAllPlans" : 1,
    "nscannedAllPlans" : 1,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
        "country" : [
            [
                "Portugal",
                "Portugal"
            ]
        ],
        "custom_data.type" : [
            [
                "sessions",
                "sessions"
            ]
        ],
        "custom_data.value" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ]
    },
    "server" : "Aspire-5750:27017"
}

【讨论】:

  • 谢谢@ronasta!真的很喜欢你的回答。解决我的问题!
猜你喜欢
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
相关资源
最近更新 更多