Javascript Mongodb,通过控件减少列表

Javascript Mongodb,通过控件减少列表,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正在构建一个用于管理项目的应用程序。 A项目如下所示: { "_id": ObjectId("..."), "title": "MySuperProject", "files": [ { "title":"My skiing day !", "right":[{ "role":"USER", "access":["read"] }] }, { "title":"My little

我正在构建一个用于管理项目的应用程序。 A项目如下所示:

{
  "_id": ObjectId("..."),
  "title": "MySuperProject",
  "files": [
    {
      "title":"My skiing day !",
      "right":[{
        "role":"USER",
        "access":["read"]
      }]
    },
    {
      "title":"My little dog, so cute !",
      "right":[{
        "role":"OTHER",
        "access":["read"]
      }]
    }
  ]
}
我们可以在这里看到两个不同的角色:
USER
OTHER

当我使用
用户
角色获取上述项目时,我需要具有以下表示,而不使用
其他
文件:

{
  "_id": ObjectId("..."),
  "title": "MySuperProject",
  "files": [
    {
      "title":"My skiing day !",
      "right":{
        "role":"USER",
        "access":["read"]
      }
    }]
}
是否存在一种基于查询减少文档内部列表的方法,还是应该根据结果手动创建列表

我正在研究
nodejs
mongoose

谢谢你的帮助


编辑:事实上,
右键
是一个
数组
这是该阶段的经典用例之一。您可以将其汇总如下:

var role = "USER";
var projectTitle = "MySuperProject";

db.t.aggregate([
  {
    $match: {
      "title":projectTitle
    }
  },
  {
    $redact: {
      $cond: [{
        $eq: [role, {
          $ifNull: ["$role", role]
        }]
      }, "$$DESCEND", "$$PRUNE"]
    }
  }
])
输出:

{
        "_id" : 1,
        "title" : "MySuperProject",
        "files" : [
                {
                        "title" : "My skiing day !",
                        "right" : [
                                {
                                        "role" : "USER",
                                        "access" : [
                                                "read"
                                        ]
                                }
                        ]
                },
                {
                        "title" : "My little dog, so cute !",
                        "right" : [ ]
                }
        ]
}
{
        "_id" : 1,
        "title" : "MySuperProject",
        "files" : [
                {
                        "title" : "My skiing day !",
                        "right" : [
                                {
                                        "role" : "USER",
                                        "access" : [
                                                "read"
                                        ]
                                }
                        ]
                }
        ]
}
在每个级别上,仅当特定级别的文档返回到
$redact
阶段所显示的值时,才会对文档进行评估,我们将其分为子文档,否则

它将列出每个项目的所有文件,以及每个文件的访问角色数组。如果要排除“用户”无权访问的文件,可以再次
$redact

db.t.aggregate([
  {
    $match: {
      "title": projectTitle
    }
  },
  {
    $redact: {
      $cond: [{
        $eq: [role, {
          $ifNull: ["$role", role]
        }]
      }, "$$DESCEND", "$$PRUNE"]
    }
  },
  {
    $redact: {
      $cond: [{
        $gt: [{
          $size: {
            $ifNull: ["$right", [1]]
          }
        }, 0]
      }, "$$DESCEND", "$$PRUNE"]
    }
  },
])
输出:

{
        "_id" : 1,
        "title" : "MySuperProject",
        "files" : [
                {
                        "title" : "My skiing day !",
                        "right" : [
                                {
                                        "role" : "USER",
                                        "access" : [
                                                "read"
                                        ]
                                }
                        ]
                },
                {
                        "title" : "My little dog, so cute !",
                        "right" : [ ]
                }
        ]
}
{
        "_id" : 1,
        "title" : "MySuperProject",
        "files" : [
                {
                        "title" : "My skiing day !",
                        "right" : [
                                {
                                        "role" : "USER",
                                        "access" : [
                                                "read"
                                        ]
                                }
                        ]
                }
        ]
}

上述方法避免了成本高昂的
$unwind
阶段。最好采取不同的方法,看看哪一种最适合你。

谢谢你的帮助。我已经编辑了我的问题,你的代码实际上不适合我:/@Skahrz是的,不会。因为你的编辑改变了你问题的整个背景。将相应地更新我的帖子。@Skahrz已编辑了我的答案。请检查它是否满足您的要求。真棒的回答,谢谢!它接近工作状态,我只需要显示多个项目:)。我在工作,最近发生了什么事!事实上,它似乎检查了我的每个对象列表。实际上,我有另一个列表要加载,其中包含一个角色值,而且似乎请求也减少了这个列表,即使我没有对它进行精确化。。。