MongoDB:根据数组字段和字符串字段的搜索项获取文档

时间:2017-09-19 18:19:55

标签: mongodb

我需要根据两个字段对我的mongoDB集合执行搜索:title(一个字符串)和tags,这是一个数组。

假设这是该集合的示例数据:

{
  title: 'A tornado article',
  tags: [
    'nature',
    'storm'
  ]
},
{
  title: 'Just another article',
  tags: [
    'hurricane',
    'type I'
  ]
},
{
  title: 'Different article',
  tags: [
    'tornado',
    'type II'
  ]
}

我的搜索字符串是const term = 'tornado type I',然后我应该把所有文件都作为

  • 第一个在标题
  • 中有龙卷风
  • 第二个标签 type I
  • 第三个标签为 tornado

我尝试从此开始执行搜索:

Collection.find(
  {
    $or: [
      { 'meta.title': new RegExp(term, 'i') },
      { 'meta.tags': term }
    ]
  }
)

因此,如果搜索词仅为tornado,我将获得第一个文档。使用我的示例术语字符串,我得不到任何结果。

1 个答案:

答案 0 :(得分:0)

如果希望将包含所需的任何标记的对象返回到$in运算符,它将选择字段值等于指定数组中任何值的文档。

但要这样做,你需要传递一系列条款,为此我已将你的条款分开

" "并将该变量传递给$in,如此

var term = 'tornado type I nature';
var splitted = term.split(' ');

    Collection.find({
        $or: [{
                'title': new RegExp(term, 'i')
            }, {
                "tags": {
                    $in: splitted
                }
            }
        ]
    })

或者,如果您还希望regex搜索标记,则可以使用|加入数组以构建正则表达式语句,之后您可以像这样传递它。

var term = 'tornado type I nature';
var splitted = term.split(' ');
var splittedRegex = new RegExp(splitted.join('|'), 'i');

Colleciton.find({
    $or: [{
            'title': new RegExp(term, 'i')
        }, {
            "tags": {
                $in: [splittedRegex]
            }
        }
    ]
})