我有一个我从来没有遇到一个棘手的问题mongoDB
。
文件:
在我documents
的collection
有含名为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
是含有相同object
和category - keys
一个array - 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。
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()
}
奇迹般有效
我已经在评论暗示:你的文档结构不支持高效率和简单的搜索。我只能猜测的原因,但我怀疑你坚持一些关系的想法,如“模式”或“正常化”,这只是没有任何意义的文件数据库。
如果没有更深的挖掘模型的问题,我能想象这样的事情对你的情况:
{
_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" ] } }
}
即使是零时间情况符合你的搜索要求,因为没有这些标准收益率的和过滤器{}这是发现,一切过滤器表达式。
再次,要绝对明确:使用蒙戈时,忘了你知道的一切,从关系世界的“最佳实践”。你需要考虑的是:你有什么疑问,和我的文档模型如何支持这些查询以理想的方式。