如何使用find()返回带有匹配值列表的多个文档



我正在测试find()和$in,我提供一个数组,其中包含匹配的名称列表作为查询输入,以查找相应的_id。但是,即使在数组中有多个匹配的用户名,我也只能得到一个匹配的(第一个)。

如何使用用户名列表作为查询输入返回多个匹配项?"in&quot美元;正确的方法是什么?

ps:我是web编程的新手;

exports.getUserID = (req, res, next) => {
const namearray = req.body.name.split(',');
console.log('name array:', namearray);
const myCursor = User.find({ name: { $in: namearray } }).then(users => {
users.forEach(user => {
console.log('found user id:', user._id);
});
res.status(200).send(users);
});
};

它只返回一个文档,如下所示,即使namearray有3个匹配的名称。

[
{
"works": [],
"_id": "6xxxxxxxxxxxxx",
"name": "user1",
"email": "user1@test.com",
"__v": 0
}
]

控制台输出:

name array: [ 'user1', ' user2', ' user3' ]
found user id: 6xxxxxxxxxxxxx

如果我使用数组(userName)硬编码一个名称列表,如下所示,它工作得很好。

exports.getUserID = (req, res, next) => {
const userNAME = ['user1', 'user2', 'user3'];
// const namearray = req.body.name.split(',');
const myCursor = User.find({ name: { $in: userNAME } }).then(users => {
users.forEach(user => {
console.log('found user id:', user._id);
});
res.status(200).send(users);
});
};

当硬编码名称数组时,返回3个匹配的文档。

[
{
"works": [],
"_id": "6xxxxxxxxxxxxx",
"name": "user1",
"email": "user1@test.com",
"__v": 0
},
{
"works": [],
"_id": "6xxxxxxxxxxxxx",
"name": "user2",
"email": "user2@test.com",
"__v": 0
},
{
"works": [],
"_id": "6xxxxxxxxxxxxx",
"name": "user3",
"email": "user3@test.com",
"passwordChangedAt": "2019-07-01T00:00:00.000Z",
"__v": 0
}
]

控制台输出:

found user id: 6xxxxxxxxxxxx1
found user id: 6xxxxxxxxxxxx2
found user id: 6xxxxxxxxxxxx3

下面是我的HTML代码:

<!DOCTYPE html>
<html> 
<form action="/users/getUserID" method="POST" id="getuserid" enctype="application/x-www-form-urlencoded"> 
<div>
<label for="name"> Enter User Name(s) (separate users by comma): </label> 
<input type="text" id="name" name="name">
<button id="getuserid" type="submit"> Get ID </button> 
</div>
</form>
</html>

ps:稍后我会将找到的用户ID保存为对象ID数组,以便写入另一个集合中,该集合使用objectID数组作为其模式

$in是正确的方法。我认为问题在于你分割namearray的方式。结果中有空格,这就是为什么它与硬编码解决方案一起工作。修改这一行:

const namearray = req.body.name.split(',');

:

const namearray = req.body.name.split(', ');

除了D. Zsolt指出的解决方案外,我还使用map()来修剪空格。

const namearray = req.body.name.split(',').map(item => item.trim());

最新更新