Mongoose,如何用两个或条件做一个find()

时间:2014-01-22 04:39:44

标签: node.js mongodb mongoose

我正在尝试进行查找,这将获得所有具有标题或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过滤。我猜我会以错误的方式去做。

有人可以帮我弄清楚如何正确地做到这一点吗?

2 个答案:

答案 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块的方法,而不是采用最简单的方法。