0

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

为以下用户发送的数据:

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

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

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

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

一个查询示例可能是:

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

提前致谢

4

1 回答 1

0

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

 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"
}
于 2013-04-03T21:56:54.973 回答