猫鼬查询具有不同值的相同字段
Posted
技术标签:
【中文标题】猫鼬查询具有不同值的相同字段【英文标题】:mongoose query same field with different values 【发布时间】:2017-08-26 01:57:39 【问题描述】:有没有办法让用户mongoose.find(title:'some title')
查询具有多个值的同一字段?例如像 mongoose.find(title:'some title', title:'some other title')
这样的东西只发回匹配 title:'some other title
的文档有没有办法做到这一点?
【问题讨论】:
【参考方案1】:mongodb 文本搜索 "title":"some thing" 将返回任何包含单词“some”或单词“thing”的文档。我不会完全匹配短语“some thing”。
因此,如果您想查找包含任何一系列单词的所有标题,您只需执行 "title":"word one 二三四 something dog cat last word" 它将返回任何包含任何单词的文档里面的那些话。
如果您想进行精确的词组匹配,那么您必须更改您的原始查询。
【讨论】:
mongodb 查询 "title":"some thing" 将返回任何包含单词“some”或单词“thing”的文档。你确定吗? 文本搜索采用“MongoDB 解析并用于查询文本索引的术语字符串。MongoDB 对术语执行逻辑 OR 搜索,除非指定为短语。有关该字段的更多信息,请参阅行为。” docs.mongodb.com/manual/reference/operator/query/text。除非猫鼬修改了这种行为,否则我希望它是一样的。 我同意,但您在回答中没有提到 文本搜索。 OP 正在谈论查找搜索,而您的回答似乎具有误导性。 更新了我的答案以避免任何混淆。【参考方案2】:您应该使用 MongoDB $in
运算符 -
mongoose.find(title: $in: ['some title', 'some other title'])
您向$in
运算符提供一个数组,它将返回指定数组中具有确切标题的所有文档。
【讨论】:
这是一个正确的解决方案,不知道他为什么不接受这个。【参考方案3】:如果您是根据 URL 查询构建它,例如:http://url.com/posts?title=one
但查询中有多个值,这是一种方法:
在查询中使用&
之类的分隔符,例如http://url.com/posts?title=title&other%20title
然后设置您的请求函数以使用异步操作:
例如。 async function listPosts()
然后使用&
分隔符来检测它是否是对多个项目的查询,并相应地设置您的查询。所以列表帖子的整个查询看起来像这样:
async function listPosts(req, res, next)
const urlParts = url.parse(req.url, true);
const query = urlParts;
// Check if URL query has & char and split into multiple query strings
const multiQuery = async () =>
// Return array of any query param values containing '&'
const mQueryArr = Object.values(query).filter(i => i.indexOf('&') > -1);
if (mQueryArr.length)
Object.keys(query).forEach((key) =>
if (query[key].indexOf('&') > -1)
// Split strings containing '&' and set query to search multiple using
// mongooses '$in' operator
const queries = query[key].split('&');
query[key] = $in: queries ;
);
;
await multiQuery();
Post.find(query)
.exec((err, posts) =>
if (err)
return next(err);
return res.json( posts );
);
希望这对某人有所帮助,因为我花了一段时间才弄清楚对同一对象键进行多个查询的 URL 查询的方法。
【讨论】:
【参考方案4】:在 2021 年以同样的问题发现此问题。似乎不再需要 $in 运算符。只要你给 find() 传入一个数组,它就会搜索所有的元素。
例如:
Furniture.find(
room: [ 'first_id', 'second_id' ]
)
这将返回 room 是第一个或第二个 id 的文档。
可以写成如下查询字符串:
?room=first_id&room=second_id
无需解析——Node 会自动将其解析为数组。
【讨论】:
以上是关于猫鼬查询具有不同值的相同字段的主要内容,如果未能解决你的问题,请参考以下文章
SQL查询从具有相同列“名称”的其他两个表中获取具有不同值的单列“名称”[关闭]