Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用node.js将多个Mongodb查询组合成一个查询?_Node.js_Mongodb Query - Fatal编程技术网

如何使用node.js将多个Mongodb查询组合成一个查询?

如何使用node.js将多个Mongodb查询组合成一个查询?,node.js,mongodb-query,Node.js,Mongodb Query,上下文: 我的数据库有两个集合:“用户”和“文件” “用户”集合中的示例文档: { "username":"Adam", "email":"adam@gmail.com", "IdFilesOwned":[1,3], } { "fileId":1, "name":"randomPNG.png" } { "fileId":2, "name":"somePDF.pdf" } { "fileId":3, "name":"business.pdf" } 如您所见,

上下文:

我的数据库有两个集合:“用户”和“文件”

“用户”集合中的示例文档:

{
  "username":"Adam",
  "email":"adam@gmail.com",
  "IdFilesOwned":[1,3],
}
{
  "fileId":1,
  "name":"randomPNG.png"
}
{
  "fileId":2,
  "name":"somePDF.pdf"
}
{
  "fileId":3,
  "name":"business.pdf"
}
如您所见,Adam目前在服务器上拥有两个文件。他们的ID是1和3

“文件”集合中的示例文档:

{
  "username":"Adam",
  "email":"adam@gmail.com",
  "IdFilesOwned":[1,3],
}
{
  "fileId":1,
  "name":"randomPNG.png"
}
{
  "fileId":2,
  "name":"somePDF.pdf"
}
{
  "fileId":3,
  "name":"business.pdf"
}
如您所见,我的服务器上有三个文档,每个文档都有一个id和一些元数据

现在,Adam想查看他拥有的所有文件及其元数据。我实现这一点的方式是:

1.查找Adam拥有的文件ID数组

2.让node.js遍历每个id(使用for-each循环),并查询每个id的元数据


问题是NodeJ将进行多个查询(每个id一个查询)。这似乎效率很低。因此,我的问题是,是否有更好的方法来实现这一点?

我没有太多直接使用驱动程序的经验,但您应该能够做到以下几点

db.users.aggregate([
{
$lookup:{
从:“文件”,
localField:“IdFilesOwned”,
foreignField:“文件ID”,
as:“文件”
}
}
]);

您可以使用$in运算符 所以它看起来像这样

db.collection('files').find({ fileId: { $in: [<value1>, <value2>, ... <valueN> ] } })
db.collection('files').find({fileId:{$in:[,…]})

这肯定比查找更有效。祝你好运。

你用的是什么驱动程序?另外,为什么不将文件存储在用户集合中(而不是
IdFilesOwned
,而是
FilesOwned
)?@c1more我不与用户一起存储文件,因为我想添加与其他用户共享文件的功能(类似于google drive)。另外,我正在使用nodejs驱动程序3.4,您可以使用一个。我会尽量打一个更好的答案,但你可以用它来开始。谢谢。我去看看