我正在对文档的以下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" }
稍后修改
这个查询似乎确实起作用,问题原来是数据而不是查询。人为错误。我道歉:)
答案 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"}}]})