如何搜索两列(其中一列仅出现在几条记录中)?

时间:2016-11-24 08:24:10

标签: mongodb mongoose

我正在对文档的以下2列执行搜索:名称 displayName 。但是,只有少数记录具有 displayName 列。当记录同时存在时,我想搜索两个字段(name和displayName)以寻找可能的匹配。否则,如果记录中没有 displayName 列,我只想搜索名称。所以我以为我会做一个 OR 。但是,这只会搜索包含两列的字段 - 尽管我想搜索所有记录。

如何更新查询以实现上述目标?这是我试过的:

function search(search) {
  return this.find({ $or: [
      {"displayName" : {"$regex" : ".*"+ search +".*", "$options": "-i"}},
      {"name" : {"$regex" : ".*"+ search +".*", "$options": "-i"}}
  ]}).exec();
}

因此,在上面的查询中,逻辑告诉我,如果 displayName 列不存在,则第一次检查将返回 false ,以便它将搜索名称,它将根据匹配返回true / false。我显然在这里遗漏了一些东西,因为即使第二次检查是真的,整体结果也是假的(更像是AND行为而不是OR)。

数据示例:

{ id: 3, name: "John Steinbeck", displayName: "Steinbeck" }
{ id: 4, name: "John Lennon" }
{ id: 5, name: "Doe", displayName: "John" }
{ id: 5, name: "Harry Potter", displayName: "Harry" }

搜索字词:

john

预期结果:

{ id: 3, name: "John Steinbeck", displayName: "Steinbeck" }
{ id: 4, name: "John Lennon" }
{ id: 5, name: "Doe", displayName: "John" }

稍后修改

这个查询似乎确实起作用,问题原来是数据而不是查询。人为错误。我道歉:)

2 个答案:

答案 0 :(得分:0)

你有不同的条件:

  • 两个字段都存在并且具有正确的值
  • 仅存在名称且值正确

使用$exist$or

例如:

db.col.find({ $or: [ { name: {$regex : ".*John.*"}}, displayName: {$regex : ".*Steinbeck.*"}}, { name: "john", { displayName: { $exists: false } } } ] } )

答案 1 :(得分:0)

更改您的查询:

db.getCollection('user').find({ $or: [
  {"name" : {$regex: "john", $options: "$i"}},
  {"displayName" : {$regex: "john", $options: "$i"}}]})