基于多个子文档的MongoDB/Mongoose查询

Posted

技术标签:

【中文标题】基于多个子文档的MongoDB/Mongoose查询【英文标题】:MongoDB/Mongoose query based on multiple subdocuments 【发布时间】:2017-10-01 15:57:41 【问题描述】:

我是 MongoDB 和 Mongoose 的新手。我目前正在构建一个应用程序,该应用程序具有一个客户端集合,其中包含客户端拥有的一组帐户。

我想根据客户拥有的帐户的详细信息查询集合。比如我需要返回的客户端是:

clientType:“标准” 有两个帐户: accountType:“FML”,余额:$gt 3000 accountType:“OMG”,余额:$lt 3000

以下是示例文档:


    clientDetails: 
        cardNumber: "0123456",
        firstName: "Bob",
        lastName: "Dole",
        clientType: "Standard"
    ,
    accounts: [
        
            accountNumber: "123",
            accountType: "FML",
            balance: 4000.00
        ,
        
            accountNumber: "234",
            accountType: "OMG",
            balance: 2000
        
    ]

到目前为止,我只知道如何构建一个查询,该查询可以使用 accountTypes ["FML","OMG] 获取 clientType "Standard" 的客户端,但我不知道如何指定余额条件对于特定的 accountTypes。

ClientModel
    .find(
        "clientDetails.clientType": "Standard",
        "accounts.accountType":  $all ["FML", "OMG"]
    )
    .then(
        function() //etc..,
        function(err) //etc...
    );

【问题讨论】:

【参考方案1】:

您可以将$all$elemMatch 一起使用。

ClientModel
    .find(
        "clientDetails.clientType": "Standard",
        "accounts": 
           
             $all: [
                      "$elemMatch" :  accountType: "FML", balance:  $gt: 3000  ,
                      "$elemMatch" :  accountType: "OMG", balance:  $lt: 3000   
               ]
          
    )
    .then(
        function() //etc..,
        function(err) //etc...
    );

【讨论】:

这很好用。谢谢!我忘了提到客户可能有很多帐户。是否可以过滤掉不符合这些条件的帐户? Np。我认为您无法使用常规查询。您可能必须使用聚合管道。看看这是否有帮助***.com/questions/15117030/… 感谢您的帮助!我去看看。

以上是关于基于多个子文档的MongoDB/Mongoose查询的主要内容,如果未能解决你的问题,请参考以下文章

使用聚合 mongodb mongoose 将集合子子文档与其他集合子文档连接起来

MongoDB mongoose 子文档创建了两次

填充多个参考(子文档)并选择特定字段

mongoDB (mongoose增删改查聚合索引连接备份与恢复监控等等)

MongoDB/Mongoose 一对多,在子节点中引用父节点 - 分组并加入

mongodb -mongoose 增删查改