草庐IT

node.js - 按子子文档过滤子文档

coder 2023-11-06 原文

想象一下,您有以下 Mongoose 模式:

mongoose.model('Team', mongoose.Schema(
{
 players : [{ 
    trikots : [{
        isNew : Boolean,
        color : String
    }]
 }]
})

我想查询我的数据以获取所有符合以下条件的团队

  • 有三角裤{isNew : true, color : red}
  • 只选择有三叉戟的球员{isNew : true, color : red}

我开始对子子文档使用 $elemMatch,但他们仍然是假玩家。我必须使用 aggregate() 吗?以及如何?

最佳答案

是的,使用 aggregation framework 是可以实现的。您的聚合管道将包含 $match运算符成为初始阶段。这将按指定条件过滤集合中的文档。下一个流水线步骤将是几个 $uniwnd两个数组、players 和嵌套的 players.trikots 上的运算符。 $uniwnd之后,您将需要另一个 $match然后将解构的数组文档过滤到所需的标准,这将成为您的最终解决方案。

让我们通过将具有上述模式的几个文档插入到 mongo shell 中的团队集合来演示这一点:

db.team.insert([
{
    "players" : [ 
        {
            "trikots" : [ 
                {
                    "isNew" : true,
                    "color" : "red"
                }, 
                {
                    "isNew" : true,
                    "color" : "blue"
                }
            ]
        }, 
        {
            "trikots" : [ 
                {
                    "isNew" : false,
                    "color" : "red"
                }, 
                {
                    "isNew" : true,
                    "color" : "green"
                }
            ]
        }
    ]
},
{
    "players" : [ 
        {
            "trikots" : [ 
                {
                    "isNew" : false,
                    "color" : "red"
                }, 
                {
                    "isNew" : false,
                    "color" : "blue"
                }
            ]
        }
    ]
}
])

然后可以按如下方式实现上述聚合管道:

var pipeline = [
    {
        "$match": {
            "players.trikots.isNew": true,
            "players.trikots.color": "red"
        }
    },
    {
        "$unwind": "$players"
    },
    {
        "$unwind": "$players.trikots"
    },
    {
        "$match": {
            "players.trikots.isNew": true,
            "players.trikots.color": "red"
        }
    }
];
db.team.aggregate(pipeline);

输出:

/* 1 */
{
    "result" : [ 
        {
            "_id" : ObjectId("554bce9a2ba32ccf7f139bae"),
            "players" : {
                "trikots" : {
                    "isNew" : true,
                    "color" : "red"
                }
            }
        }
    ],
    "ok" : 1
}

您的 Mongoose 聚合会类似:

Team.aggregate(pipeline).exec(callback);

或使用 Mongoose aggregation pipeline builder 流畅的通话:

Team.aggregate()
    .match({"players.trikots.isNew": true,"players.trikots.color": "red"})
    .unwind("players")
    .unwind("players.trikots")
    .match({"players.trikots.isNew": true,"players.trikots.color": "red"}) 
    .exec(callback);

关于node.js - 按子子文档过滤子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30111186/

有关node.js - 按子子文档过滤子文档的更多相关文章

  1. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  2. ruby-on-rails - 在 Controller 中干净地处理多个过滤器(参数) - 2

    我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告

  3. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  4. ruby-on-rails - Rails 3 - 过滤器链暂停为 :authentication rendered or redirected - 2

    我仍然收到标题中的“错误”消息,但不知道如何解决。在ApplicationController中,classApplicationController在routes.rb#match'set_activity_account/:id/:value'=>'users#account_activity',:as=>:set_activity_account--thisdoesn'tworkaswell..resources:usersdomemberdoget:action_a,:action_bendcollectiondoget'account_activity'endend和User

  5. ruby-on-rails - ActiveAdmin 自定义选择过滤器下拉名称 - 2

    对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking

  6. ruby-on-rails - Assets 管道损坏 : Not compiling on the fly css and js files - 2

    我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1

  7. ruby-on-rails - Rails - 理解 application.js 和 application.css - 2

    rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:

  8. node.js - 如何在 Travis CI 上的一个项目中运行 Node.js 和 Ruby 测试 - 2

    我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每

  9. ruby - 如何通过 belongs_to 按外部 id 和本地属性进行过滤? - 2

    以下模型通过belongs_to链接:require'mongoid'classSensorincludeMongoid::Documentfield:sensor_id,type:Stringvalidates_uniqueness_of:sensor_idend...require'mongoid'require_relative'sensor.rb'classSensorDataincludeMongoid::Documentbelongs_to:sensorfield:date,type:Datefield:ozonMax1h,type:Floatfield:ozonMax8h

  10. ruby-on-rails - ruby open ssl api for encrypted key (without nodes option) - 2

    在安装了openssllib的linux机器上,当您执行带有“-nodes”选项的“opensslpkcs12”时,您将获得带有未加密私钥的输出,但如果您跳过–nodes选项,则输出将具有加密的私钥。e.g.opensslpkcs12-intest.pfx-outtest.pem你应该看到像下面这样加密的私钥-----BEGINENCRYPTEDPRIVATEKEY-----MIIFDjBABgkqhkiGG7s=-----ENDENCRYPTEDPRIVATEKEY-----如何使用ruby​​的开放ssl库实现上述目标?这就是我用ruby​​生成私钥的方式:@private_key

随机推荐