说我们在Mongo中有以下内容
{joe: {
grocerylist: [
{ "activity" : "buy", "type" : "cheese-cheddar" },
{ "activity" : "dontbuy", "type" : "cheese-pepperjack" },
{ "activity" : "buy", "type" : "cheese" }
]}
{joanna: {
grocerylist: [
{ "activity" : "buy", "type" : "cheese-cheddar" },
{ "activity" : "buy", "type" : "cheese" }
]}
当Joe查询“cheese-pepperjack”时,它应该会导致他的“dontbuy”列表。现在当Jonna查询“cheese-pepperjack”时,它应该会产生她的“购买”列表。因为,尽管她的名单中没有明确的奶酪胡椒酱,但该查询的最长匹配是“奶酪”,她可以买到。问题是如何在Mongo中获得最长的匹配?
如果我们在python进程的内存而不是MongoDB中有上面的字典,那么我们可以使用Trie实现来获得上面的查找。 Mongo的正则表达式/ $ in可以让我一次比较一个字符串(在我的查找和“grocerylist”的一个干酪类型之间),我可以迭代整个列表,但有更好的方法吗?
由于
答案 0 :(得分:0)
根据您的搜索用例,您可以尝试以下结构:
{
"name": "joe",
"activity": "buy",
"type": "cheese-cheddar"
}
{
"name": "joe",
"activity": "dontbuy",
"type": "cheese-pepperjack"
}
{
"name": "joe",
"activity": "buy",
"type": "cheese"
}
{
"name": "joanna",
"activity": "buy",
"type": "cheese-cheddar"
}
{
"name": "joanna",
"activity": "buy",
"type": "cheese"
}
当有人搜索cheese-pepperjack
时,您可以拆分连字符并在Python ['cheese', 'cheese-pepperjack']
中创建一个列表。使用列表查询:
db.groceries.find(
{name:"joanna",
type: {$in:["cheese", "cheese-pepperjack"]}})
.sort({"type":-1})
.limit(1)
上面的查询会搜索任何type
,其值为' cheese'或者' cheese-pepperjack'。对于' joe',您可能会收到多条记录,因此您需要根据type
进行排序并限制为一条记录。另外,请勿忘记为type
字段添加index。
您可能也有兴趣: