Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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
Mongodb 试图从深度嵌套的集合中投影单个文档_Mongodb - Fatal编程技术网

Mongodb 试图从深度嵌套的集合中投影单个文档

Mongodb 试图从深度嵌套的集合中投影单个文档,mongodb,Mongodb,我有一个包含深度嵌套文档的MongoDB集合。具体来说,我的层次结构如下:客户机>项目>房间 我的目标是能够使用clientId、projectId和roomId来筛选和投影此集合,以便只从数据库返回所需的房间。文件室可能附带了许多日志和其他数据元素,将它们全部拉回来并在客户机代码中进行过滤似乎是浪费 我希望避免将集合拆分为多个集合 我不是在使用像mongoose之类的ORM,我想从现在起将其排除在外,因为这主要是一个学习练习,以提高我的MongoDB技能 我尝试过使用projection$操作

我有一个包含深度嵌套文档的MongoDB集合。具体来说,我的层次结构如下:客户机>项目>房间

我的目标是能够使用clientId、projectId和roomId来筛选和投影此集合,以便只从数据库返回所需的房间。文件室可能附带了许多日志和其他数据元素,将它们全部拉回来并在客户机代码中进行过滤似乎是浪费

我希望避免将集合拆分为多个集合

我不是在使用像mongoose之类的ORM,我想从现在起将其排除在外,因为这主要是一个学习练习,以提高我的MongoDB技能

我尝试过使用projection$操作符,它适用于第一级嵌套数组

使用此数据结构:

{ 
    "_id" : ObjectId("5c3a3fc7e72812c33ed9a0b9"), 
    "clienttype" : "Residential", 
    "name" : "Bob", 
    "projects" : [
        {
            "_id" : ObjectId("5c3a3fc7e72812c33ed9a0ba"), 
            "name" : "First Project", 
            "rooms" : [
                {
                    "_id" : ObjectId("5c5f1a9d354c541edd2eac8e"), 
                    "name" : "Room 1", 
                }, 
                {
                    "_id" : ObjectId("5c5f1d6b354c541edd2eac8f"), 
                    "name" : "Room 2", 
                }
            ]
        }, 
        {
            "_id" : ObjectId("5c3a3fc7e72812c33ed9a0bb"), 
            "name" : "Second Project", 
            "rooms" : [
                {
                    "_id" : ObjectId("5c5f1da6354c541edd2eac96"), 
                    "name" : "Room 3", 
                }
            ]
        }
    ]
}

我能够成功运行此查询:

  db.getCollection("clients").find({
   "_id": ObjectId("5c3a3fc7e72812c33ed9a0b9"),
   "projects._id": ObjectId("5c3a3fc7e72812c33ed9a0ba")
  },
  {
    "projects.$":1
  })
我遇到麻烦的地方如下

使用多个位置运算符(显然不允许):

试图省略第一个$,如下面的几个答案所示,这将执行,但无法过滤rooms集合:

db.getCollection("clients").find({
   "_id": ObjectId("5c3a3fc7e72812c33ed9a0b9"),
   "projects._id": ObjectId("5c3a3fc7e72812c33ed9a0ba"),
   "projects.rooms._id": ObjectId("5c5f1d6b354c541edd2eac8f")
  },
  {
    "projects.rooms.$":1
  })

似乎因为我可以使用数组过滤器$[]从深度嵌套的集合中更新、插入和删除,所以应该有一种方法可以从深度嵌套的集合中检索单个文档


感谢您花时间提供帮助:)

关于这一点,我有一些建议:1)如果这是一个常见的查询,而且听起来对您的日常操作来说太困难,那么它可能很脆弱,将来很难更改。2) 您是否尝试过运行
db.clients.explain('executionStats')。查找(…)
并查看MongoDB计划如何执行它?3) 为什么反对将其拆分为多个集合?如果用例需要它并且它是最简单的前进方式,为什么不这样做呢?4) 看看它是否能给你提供指导。@KevinAdistambha老实说,我的很多动机都属于“愚蠢的编码技巧”一类。现在,更多的是想弄清楚如何管理深层嵌套,而不是具体的业务需求(这是一个愚蠢的个人项目)。我没有试着解释,我总是忘记它,我现在就这么做。至于不想拆分它,我没有使用ORM,mongo缺乏引用完整性检查有时让我有点紧张。你可能会对这个博客感兴趣:这里有很多不同的技巧和窍门。我对此有一些看法:1)如果这是一个常见的查询,听起来对你的日常操作来说太困难,它可能很脆弱,将来很难改变。2) 您是否尝试过运行
db.clients.explain('executionStats')。查找(…)
并查看MongoDB计划如何执行它?3) 为什么反对将其拆分为多个集合?如果用例需要它并且它是最简单的前进方式,为什么不这样做呢?4) 看看它是否能给你提供指导。@KevinAdistambha老实说,我的很多动机都属于“愚蠢的编码技巧”一类。现在,更多的是想弄清楚如何管理深层嵌套,而不是具体的业务需求(这是一个愚蠢的个人项目)。我没有试着解释,我总是忘记它,我现在就这么做。至于不想拆分它,我没有使用ORM,mongo缺乏引用完整性检查有时让我有点紧张。你可能会对这个博客感兴趣:这里有很多不同的提示和技巧。
db.getCollection("clients").find({
   "_id": ObjectId("5c3a3fc7e72812c33ed9a0b9"),
   "projects._id": ObjectId("5c3a3fc7e72812c33ed9a0ba"),
   "projects.rooms._id": ObjectId("5c5f1d6b354c541edd2eac8f")
  },
  {
    "projects.rooms.$":1
  })