【问题标题】:MongoDB - Query nested objects in nested array with array of strings filterMongoDB - 使用字符串数组过滤器查询嵌套数组中的嵌套对象
【发布时间】:2019-12-18 05:42:45
【问题描述】:

所以基本上我需要用我自己的过滤器过滤我的数据,它是字符串数组,但问题是,那个确切的字段是在 DB 数组中的嵌套对象内。所以,我的 Schema 的一部分看起来像这样:

members: [
    {
        _id: { type: Schema.Types.ObjectId, ref: "Users" },
        profilePicture: { type: String, required: true },
        profile: {
            firstName: { type: String },
            lastName: { type: String },
            occupation: { type: String },
            gender: { type: String }
        }
    }
]

我的过滤器看起来像这样

gender: ["male","female"]

使用此过滤器的预期结果是得到一个既有男性用户又有女性用户的团队,如果它只有男性或只有女性,它不应该给我那个团队。但我所尝试的一切都给了我包括男性和女性在内的一切,即使只有男性成员。

我尝试过的:

db.teams.find(members: { $elemMatch: { "profile.gender": { $in: gender } } })

这仅在过滤器中指定了一种性别时才有效,而且我知道它一定不适用于我想要实现的目标,但我不知道如何实现它。任何帮助将不胜感激

编辑:我尝试过以这种方式进行操作

db.teams.find({
    $and: [ 
        { members: { $elemMatch: { "profile.gender": gender[0] } } }, 
        { members: { $elemMatch: { "profile.gender": gender[1] } } } 
    ]
})

这只有在指定两个过滤器时才会给我结果,但是,如果只有一个过滤器(“男性”或“女性”),它不会给我任何东西。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    使用$and 运算符而不是$in。

    db.teams.find(members: {$elemMatch: {$and: [{'profile.gender': 'male'}, {'profile.gender': 'female'}]}})
    

    【讨论】:

    • 这不起作用。现在我根本没有结果。同时使用两个或一个过滤器,结果仍然没有
    【解决方案2】:

    无论您要比较多少个元素,此查询都有效

    db.teams.find({$and: [{'members.profile.gender': 'male'}, {'members.profile.gender': 'female'}]})
    

    如果您想涵盖多个案例,则需要在将查询传递给find 之前动态生成查询。

    【讨论】:

      【解决方案3】:

      您可以使用$all 运算符来执行此操作,该运算符查找包含所有指定元素的数组字段的文档:

      var gender = ['male', 'female'];
      db.teams.find({'members.profile.gender': {$all: gender}});
      

      【讨论】:

        猜你喜欢
        • 2018-08-08
        • 1970-01-01
        • 2021-10-23
        • 2019-05-17
        • 2018-09-10
        • 1970-01-01
        • 2012-07-23
        • 2016-09-05
        • 1970-01-01
        相关资源
        最近更新 更多