Mongodb列表中最长的匹配

时间:2016-05-07 00:20:50

标签: python mongodb

说我们在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”的一个干酪类型之间),我可以迭代整个列表,但有更好的方法吗?

由于

1 个答案:

答案 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

您可能也有兴趣: