首页 > 解决方案 > 如何使用带有匹配值列表的 find() 返回多个文档

问题描述

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

如何使用用户名列表作为查询输入返回多个匹配项?“$in”是正确的方法吗?

ps:我对网络编程比较陌生;下面的 id 被屏蔽;

 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 数组作为其模式的字段

标签: javascriptnode.jsmongodbmongoose

解决方案


$in是正确的方法。我认为问题在于您拆分namearray. 结果中有空格,这就是它与硬编码解决方案一起使用的原因。更改此行:

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

对此:

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

推荐阅读