整蛊MongoDB的搜索挑战

问题描述 投票:0回答:2

我有一个我从来没有遇到一个棘手的问题mongoDB

文件:

在我documentscollection有含名为object和阵列keys搜索values。键被命名后的8个categorys一个和相应的值是从该类别含array items

{
  _id: "bRtjhGNQ3eNqTiKWa",
  /* */
  search :{
    usage: ["accounting"],
    test: ["knowledgetest", "feedback"]
  }, 
  test: {
    type:"list",
    vals: [
     {name:'knowledgetest', showName: 'Wissenstest'}, 
     {name:'feedback', showName: '360 Feedback'},   
    ]
  },
  usage: {
    type:"list",
    vals: [
     {name:'accounting', showName: 'Accounting'},    
    ]
  }
},
{
  _id: "7bgvegeKZNXkKzuXs",
  /* */
  search :{
    usage: ["recruiting"],
    test: ["intelligence", "feedback"]
  }, 
  test: {
    type:"list",
    vals: [
     {name:'intelligence', showName: 'Intelligenztest'}, 
     {name:'feedback', showName: '360 Feedback'},   
    ]
  }, 
  usage: {
    type:"list",
    vals: [
     {name:'recruiting', showName: 'Recruiting'},    
    ]
  }
},

查询

所述query是含有相同objectcategory - keys一个array - values

{
  usage: ["accounting", "assessment"],
  test : ["feedback"]
}

期望的结果

  • 如果查询是空的,我想all文件。
  • 如果查询有one类别和任意数量的项目,我想所有具有所有documents的指定itemscategory
  • 如果查询有一个以上的类别,我希望所有具有所有documents在所有指定itemscategorys

我尝试

我试过各种变化:

XX.find({
'search': {
  "$elemMatch": {
    'tool': {
      "$in" : ['feedback']
    }
  }
}

没有成功。编辑尝试:'search.test': {$all: (query.test ? query.test : [])}这让我没有结果,如果我有什么选择;当我只想找的documents范畴内的权利test;当我还看usage类别里面什么都没有。

这是在我的应用程序的心脏,因此,我在历史上竖起了bounty

mongodb search meteor
2个回答
1
投票
    let tools = []
    const search = {}
    for (var q in query) {
      if (query.hasOwnProperty(q)) {
        if (query[q]) {
          search['search.'+q] = {$all: query[q] }
        }
      }
    }


    if (Object.keys(query).length > 0) {
      tools = ToolsCollection.find(search).fetch()
    } else {
      tools = ToolsCollection.find({}).fetch()
    }

奇迹般有效


0
投票

我已经在评论暗示:你的文档结构不支持高效率和简单的搜索。我只能猜测的原因,但我怀疑你坚持一些关系的想法,如“模式”或“正常化”,这只是没有任何意义的文件数据库。

如果没有更深的挖掘模型的问题,我能想象这样的事情对你的情况:

{
  _id: "bRtjhGNQ3eNqTiKWa",
  /* */
  search :{
    usage: ["accounting"],
    test: ["knowledgetest", "feedback"]
  }, 
  test: {
    "knowledgetest" : {
       "showName": "Wissenstest"
    },
    "feedback" : {
         "showName": "360 Feedback"
    }
  },
  usage: {
    "accounting" : {
        "values" : [ "knowledgetest", "feedback" ],
        "showName" : "Accounting"
    }
  }
},
{
  _id: "7bgvegeKZNXkKzuXs",
  /* */
  search : {
    usage: ["recruiting"],
    test: ["intelligence", "feedback"]
  }, 
  test: {
    "intelligence" : {
        showName: 'Intelligenztest'
     },
     "feedback" : {
        showName: '360 Feedback'
    }
  }, 
  usage: {
    "recruiting" : {
        "values" : [ "intelligence", "feedback" ],
        "showName" : "Recruiting"
    }
  }
}

然后,“knowledgetest”和“反馈”,在“会计”的搜索将是一个简单的

{ "usage.accounting.values" : { $all : [ "knowledgetest", "feedback"] } }

它可以很容易地在一个和条件被使用多次:

{
  { "usage.accounting.values" : { $all : [ "knowledgetest", "feedback"] } },
  { "usage.anothercategory.values" : { $all [ "knowledgetest", "assessment" ] } }
}

即使是零时间情况符合你的搜索要求,因为没有这些标准收益率的和过滤器{}这是发现,一切过滤器表达式。

再次,要绝对明确:使用蒙戈时,忘了你知道的一切,从关系世界的“最佳实践”。你需要考虑的是:你有什么疑问,和我的文档模型如何支持这些查询以理想的方式。

© www.soinside.com 2019 - 2024. All rights reserved.