我正在尝试进行查找,这将获得所有具有标题或desc的文档,其中包含正则表达式(有效),然后进一步过滤以仅包含将“private”标志设置为false或“user”字段设置为给定的userId。
这是我到目前为止所做的...
FCSet.find({}, {"flashCards":0}).or([{ 'title': { $regex: re }}, { 'desc': { $regex: re }}]).or([{ 'private': false}, { 'user': 'userId'}]).sort('title')
这应该只返回6行但它返回56.如果我取出第2或()然后它适用于按标题/ desc过滤。我猜我会以错误的方式去做。
有人可以帮我弄清楚如何正确地做到这一点吗?
答案 0 :(得分:12)
您必须将OR
放入AND
:
FCSet.find(
{ "flashCards": 0 },
$and: [
{
$or: [
{ 'title': { $regex: re } },
{ 'desc': { $regex: re } }
]
},
{
$or: [
{ 'private': false },
{ 'user': 'userId' }
]
}
]
).sort('title')
答案 1 :(得分:2)
@heinob的答案是完全正确的,但我恳请你不要使用它。
最大的原因是嵌套的$or
查询不使用索引:https://jira.mongodb.org/browse/SERVER-3327
(实际上更具体针对您的情况:https://jira.mongodb.org/browse/SERVER-6542)
因此,该区块的任何索引都将毫无用处。
相反,您最好不要在应用程序中编写一个创建单个$or
块的方法,而不是采用最简单的方法。