【问题标题】:MongoDB conditional query on nested document array嵌套文档数组上的 MongoDB 条件查询
【发布时间】:2020-08-06 23:24:39
【问题描述】:

您好,我正在尝试对嵌套文档数组编写条件查询。 我已经阅读该文档好几天了,但无法弄清楚如何进行这项工作。 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”的数组。

但我想要的是两支球队,因为“Mario”是“Bowser”(team2)的替代品之一。

我没有进行查询,但我一直在尝试不使用 $where,因为官方 MongoDB 文档说:

首选聚合替代方案

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

鉴于可用的聚合运算符:

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

但是如果它可以很容易地用$where 运算符编写,那就完全没问题了。

我们将不胜感激任何有助于进一步发展的建议或想法。

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

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

    1. 如果要过滤在匹配条件中定义了name 的所有文档(返回两个文档):

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

    2. 如果您想过滤所有在替代数组中提供任何球员姓名的文档(它只返回一个,因为 team1 没有任何替代球员是马里奥/瓦里奥)

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

    3. 正在查看的名称可能存在于namesubstitute

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

    【讨论】:

    • 我认为他也是这个意思。但是重新阅读它,我认为他想要所有同时存在 mario 和 wario 的 theams,但它们是否存在于 player.name 或 player.subtitutes 中并不重要。那么他的询问就更有意义了。此外,这不是微不足道的,我认为没有聚合就无法完成(或者我遗漏了一些明显的东西)。
    • 我会将 player.name 包含在他自己的替代品中,至少这样查询起来很容易。 (如果需要,在发送到前端之前过滤掉)然后你可以使用 Yahya 的 2 号解决方案。
    • 这正是 ippi 解释的。我想先过滤玩家的名字,如果不存在,可以进行玩家的替换。
    • 我已经添加了解决方案#3,这就是你要找的吗?
    • 刚刚发现这对我不起作用:(它必须验证每个球员,如果球员不匹配,那么它必须寻找其中一个替补球员是否匹配。#3查询向我显示了球队,即使他们只有一名匹配的球员。但我认为你的回答可能会导致一些事情。谢谢
    猜你喜欢
    • 2019-10-09
    • 1970-01-01
    • 2019-02-20
    • 2021-02-25
    • 2016-08-16
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多