查找大文档内的对象

是NoSQL / MongoDB的新手我想知道如何从一个可能的大文档中获取特定的对象。

我的项目集合中的文档如下所示:

{ "_id" : ObjectId("5935a41f12f3fac949a5f925"), "project_id" : 13, "updated_at" : ISODate("2017-06-28T01:43:50.994Z"), "created_at" : ISODate("2017-06-05T18:34:07.150Z"), "owner" : ObjectId("591eea4439e1ce33b47e73c3"), "name" : "My demo project 1", "visibility" : 0, "uploaded_files" : [ { "fieldname" : "sourceStrings", "originalname" : "Log_20-6-2017_19-03-24-626.txt", "encoding" : "7bit", "mimetype" : "text/plain", "_id" : ObjectId("5952deb44fb371d8bc00dd43") }] } 

而不是只有一个“上传的文件对象”,可能有数百个。 我需要获取项目信息(如所有者,可见性,名称等),然后我想通过_id获取uploaded_file对象。 很明显,我可以遍历uploaded_files中的所有对象,但是我认为这是性能上可怕的。 我到目前为止是:

 var projectId = req.params.projectId var fileId = req.body.fileId Project.findOne({ project_id: projectId }).populate('owner').then(project => { if (!project) return res.send(404, { error: "Couldn't find a project with this id" // Here I want to get the uploaded_file object }) 

我的问题:

  1. 那么如何通过_id字段有效地从uploaded_files数组中获取单个对象呢?
  2. 我需要这种行为的两种情况,首先是我需要删除/修改上传的文件,或者我想获取所有的信息。

有一个更好的数据库/文件devise,我想实现什么?

您可以尝试使用“$ elemMatch”投影所需的对象,如下所示:

 Project.findOne({ project_id: projectId } , {uploaded_files: {$elemMatch: {_id: fileId}}}) 

这将只返回所需的文件对象的数组。

并涉及到如何更新它可以尝试以下操作:

 Project.update({ project_id: projectId , 'uploaded_files._id' : fileId} , {$set : {"uploaded_files.$.originalname" : "new data"} }) //for example updating its "original name" filed and so on. 

并注意“$”引用的第一个项目匹配查询,它应该只有一个由于取决于查询中的“_id”属性。

最后要删除数组中的具体元素,可以尝试下面的方法:

 Project.update({ project_id: projectId }, {$pull : {"uploaded_files" : {_id:fileId}} })