嵌套文档数组上的MongoDB条件查询

时间:2020-08-05 08:06:07

标签: mongodb mongoose

嗨,我正在尝试在嵌套文档数组上编写条件查询。 我已经阅读了好几天的文档,却无法弄清楚如何进行这项工作。 DB如下所示:

[
   {
      "id":1,
      "team":"team1",
      "players":[
         {
            "name":"Mario",
            "substitutes":[
               "Luigi",
               "Yoshi"
            ]
         },
         {
            "name":"Wario",
            "substitutes":[

            ]
         }
      ]
   },
   {
      "id":2,
      "team":"team2",
      "players":[
         {
            "name":"Bowser",
            "substitutes":[
               "Toad",
               "Mario"
            ]
         },
         {
            "name":"Wario",
            "substitutes":[

            ]
         }
      ]
   }
]

由于我缺乏英语,很难讲,但我想做的是 寻找包括所有被查询球员的球队。 玩家数组中的每个对象都有一些替代品。 对于玩家数组中的每个对象,如果所查询的玩家之一不是主要玩家(“ players.name”),那么我希望它查找是否有替代者(“ players.substitutes”)之一。

Team.find({players:{$in:[ 'Mario', 'Wario' ]}}) (mongoose query)

这将给我一个带有'team1'的数组。

但是我想得到的都是两支球队,因为“马里奥”是“弓箭手”(team2)的替代者之一。

我无法进行查询,但是自从MongoDB官方文档说:

以来,我一直在尝试不使用$ where。

推荐的替代方案

从MongoDB 3.6开始,$ expr运算符允许使用 查询语言中的聚合表达式。并且,从 MongoDB 4.4,$ function和$ accumulator允许用户定义 如果提供的管道,则使用JavaScript中的自定义聚合表达式 操作员无法满足您的应用程序需求。

给出可用的聚合运算符:

将$ expr与不使用JavaScript的聚合运算符一起使用 (即非$ function和非$ accumulator运算符)比 $ where,因为它不执行JavaScript,因此应该首选 如果可能的话。但是,如果必须创建自定义表达式,则$ function 比$where更为可取。

但是如果可以轻松地使用$where运算符编写,那么就很好了。

任何有助于进一步发展的建议或想法都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

首先,您的查询不正确。而且您的过滤条件究竟是什么也不是很明显。所以我给出两个建议:

  1. 如果要过滤在匹配条件中定义了db.Team.find({"players.name":{$in:[ 'Mario', 'Wario' ]}}).pretty()的所有文档(返回两个文档):

    db.Team.find({"players.substitutes":{$in:[ 'Mario', 'Wario' ]}}).pretty()

  2. 如果要过滤所有在替代数组中具有任何提供的球员姓名的文档(由于team1没有任何替代,则仅返回一个,因此返回Mario / Wario)

    name

  3. 正在查看的名称可能出现在substitutedb.Team.find({ $or: [{"players.substitutes":{$in:[ 'Mario', 'Wario' ]}}, {"players.name":{$in:[ 'Mario', 'Wario' ]}}] }).pretty()

    org.apache.httpcomponents:httpclient

相关问题