使用$或运算符和两个嵌套$ in条件查找对象

时间:2017-10-29 23:15:47

标签: node.js mongodb mongoose

我尝试使用Mongoose构建查询,以查找对象,如果其关键字位于关键字列表中,或者artistName位于artistNames列表中。我可以让一个或另一个搜索条件起作用,但不是两个都可以!

这是我的代码:

  Artwork.find({ $or: [{ 
      artworkKeywords: {
      $in: keywordArray}, _p_artist: {$in: artistArray}}]}).
    limit(50).
    sort({_updated_at : -1}).then((artworks) =>{
        if (isEmptyObject(artworks)){
      throw ARTWORK_NOT_FOUND;
    }
    return res.send(artworks);
  })

我已经转入keywordArray = ["photography"]artistArray =["Joe Shmoe"]

我遵循MongoDB tutorial on the logical operator的确切指示。我没有收到任何语法错误,但我确实会抛出ARTWORK NOT FOUND个异常。

按艺术家名字搜索效果很好:

 Artwork.find({  _p_artist: {$in: artistArray}})

仅搜索关键字也很有效:

Artwork.find({
      artworkKeywords: {
      $in: keywordArray}

但不能同时使用or条款!我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

你的语法错了。 $or或"要么"表示"单独的文件"。您将所有查询放入"一个文档" which means "AND"

   Artwork.find({ 
     $or: [
      { artworkKeywords: { $in: keywordArray } }, // each separate
      { _p_artist: { $in: artistArray } }          // just like separate queries
     ]
   })

所以"列表"不同的文件是" OR"的论据。你写的也可能是:

Artwork.find({ 
  artworkKeywords: { $in: keywordArray },
  _p_artist: { $in: artistArray } 
})

因为那基本上是你的一个元素"在列表中,所以它是单个" AND"条件而不是" OR"。