棘手的MongoDB搜索挑战

时间:2016-09-27 11:17:00

标签: mongodb search meteor

我有一个棘手的mongoDB问题,我从未遇到过。

文件:

我的documents中的collection有一个包含名为object和数组keys的搜索values。密钥以八个categorys中的一个命名,相应的值为array,其中包含items。{/ p>

{
  _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'},    
    ]
  }
},

查询

queryobject,包含相同的category - keysarray - values

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

期望的结果

  • 如果查询为空,我需要all个文档。
  • 如果查询包含one类别和任意数量的项目,我希望所有documents具有指定items中的所有category
  • 如果查询包含多个类别,我希望所有documents的所有items都包含在所有指定的categorys中。

我的尝试

我尝试了各种各样的变体:

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

没有成功。 的修改 试过:'search.test': {$all: (query.test ? query.test : [])}如果没有选择任何内容,我就没有结果;当我只查看documents类别时,右test;当我另外查看usage类别时,没有任何内容。

这是我的应用程序的核心,因此我历史上提出bounty

2 个答案:

答案 0 :(得分: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()
    }

像魅力一样工作

答案 1 :(得分:0)

我在评论中已经暗示过:您的文档结构不支持高效简单的搜索。我只能猜出原因,但我怀疑你坚持一些关系性的想法,如" schemas"或者"标准化"对文档数据库没有意义。

如果不深入研究建模问题,我可以根据你的情况设想类似的东西:

$state.go('products.manage_options', ({form_id: $stateParams.form_id, type:null}));

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

{
  _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"
    }
  }
}

可以在条件和条件下轻松使用多次:

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

即使零次案例也符合您的搜索要求,因为没有这些条件的过滤器会产生{},这是find-everything过滤器表达式。

再一次,要明确说明:当使用mongo时,忘记你知道的所有"最佳实践"来自关系世界。您需要考虑的是:您的查询是什么,以及我的文档模型如何以理想的方式支持这些查询。

相关问题