是否有办法让用户mongoose.find({title:'some title'})
使用多个值查询同一字段?例如,像mongoose.find({title:'some title', title:'some other title'})
这样的内容只发送回匹配title:'some other title
的文档有没有办法实现这个目标?
答案 0 :(得分:20)
您应该使用MongoDB $in
运算符 -
mongoose.find({title: {$in: ['some title', 'some other title']}})
您向$in
运算符提供了一个数组,它将返回所有在指定数组中具有精确标题的文档。
答案 1 :(得分:1)
如果您是根据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查询方法。
答案 2 :(得分:1)
在 2021 年用同样的问题找到了这个。似乎不再需要 $in 运算符。只要你给 find() 传递一个元素数组,它就会搜索所有元素。
例如:
Furniture.find({
room: [ 'first_id', 'second_id' ]
})
这将返回房间是第一个或第二个 id 的文档。
可以写成一个查询字符串,如:
?room=first_id&room=second_id
无需解析——Node 会自动将其解析为数组。
答案 3 :(得分:0)
mongodb文本搜索{“title”:“some thing”}将返回任何包含“some”或“thing”字样的文档。我不会完全匹配“某事”这句话。
因此,如果你想找到包含任何一系列单词的所有标题,你只需要{“title”:“word one two two four something dog cat last words”}它将返回任何包含任何文字的文档其中的那些词。
如果您想进行精确的词组匹配,则必须更改原始查询。