我有一个棘手的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'},
]
}
},
查询
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。
答案 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时,忘记你知道的所有"最佳实践"来自关系世界。您需要考虑的是:您的查询是什么,以及我的文档模型如何以理想的方式支持这些查询。