【问题标题】:MongoDB Query - query on values of any key in a sub-object: $match combined with $elemMatchMongoDB 查询 - 查询子对象中任何键的值:$match 与 $elemMatch 结合
【发布时间】:2017-01-11 21:15:37
【问题描述】:

如何过滤列表中同一元素中所有颜色为蓝色且大小为 50 的用户 ID?应该只输出用户 1347。

    {
        "userId": "12347",
        "settings": [
            { name: "SettingA", color: "blue", size: 10 },
            { name: "SettingB", color: "blue", size: 20 },
            { name: "SettingC", color: "green", size: 50 }
        ],    
     }
     {
        "userId": "1347",
        "settings": [
            { name: "SettingA", color: "blue", size: 10 },
            { name: "SettingB", color: "blue", size: 50 },
            { name: "SettingC", color: "green", size: 20 }
        ]    
     }

如果这可以用 $elemMatch 完成,我如何将它包含在以下查询中,假设以下两个元素需要在同一个列表中:{“rounds.round_values.decision”:“Fold”}, { "rounds.round_values.gameStage" : "翻牌前"}

我尝试了这个查询,但没有产生任何结果。我读过那是因为 elemMatch deosnt' 在预测中起作用。但是如何告诉 $filter 只返回满足 $elemmMatch 条件的对象呢?

db.games.aggregate([ 
{ $match: { $and: [ 
  { Template: "PPStrategy4016" },
  { FinalOutcome: "Lost" }]
}},
{ $elemMatch: {
  { "rounds.round_values.decision" : "Fold"},
  { "rounds.round_values.gameStage" : "PreFlop"}
   } },
{ 
    $group: { 
        _id: null, 
        total: { 
            $sum: "$FinalFundsChange" 
        } 
    } 
} ] )

【问题讨论】:

    标签: mongodb list filtering


    【解决方案1】:

    根据给定的文档,查询如下:

    db.games.aggregate( 
       {$unwind : "$settings"}, 
       {$match: {"settings.color" : "blue", "settings.size" : 50}} , 
       {$group: {_id: null, total: {$sum: "$settings.size"}}} )
    

    如果您在将其转换为您自己的域时遇到困难,请提供您域中的一些示例文档。

    【讨论】:

    • match 是如何知道蓝色和 50 号必须是 the same 元素的一部分?不只是 $elemMatch 这样做吗?
    • $unwind 展开数组,然后是$match,类似于和查询(颜色和大小)。 $elemMatch 不适用于聚合
    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2016-02-20
    • 2020-09-22
    • 1970-01-01
    • 2013-12-21
    • 2020-08-06
    相关资源
    最近更新 更多