代码之家  ›  专栏  ›  技术社区  ›  uvsmtid

MongoDB查询:键及其不同的值(每个键独立)?

  •  -1
  • uvsmtid  · 技术社区  · 3 年前

    如果您有此对象集合:

    { "a": 10, "b": 20, "c": 30 }
    { "a": 11, "b": 20, "c": 31 }
    { "a": 10, "b": 20, "c": 31 }
    
    1. 有一种方法 get distinct values ,例如,对于字段“a”:

      [10, 11]
      
    2. 还有一种方法 get distinct values of any tuple ,例如,对于成对的(“b”,“c”):

      [
          {"b": 20, "c": 30},
          {"b": 20, "c": 31}
      ]
      

    有没有一种方法可以在单个查询中单独查询每个字段的不同值?

    例如,我可以简单地对“a”、“b”、“c”使用上面的查询1 3次:

    [10, 11]
    [20]
    [30, 31]
    

    但我想这可能效率较低,应该有更好的选择。

    奖金: 如果字段列表为 未知 预付的

    理想情况下,单个查询应返回所有键及其不同的值:

    {
        "a": [10, 11],
        "b": [20],
        "c": [30, 31]
    }
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   ray    3 年前

    假设您事先不知道字段的完整列表,则需要使用 $objectToArray 转换 $$ROOT 文档转换为k-v元组数组。然后按字段名分组 $addToSet 值。

    db.collection.aggregate([
      {
        "$project": {
          _id: 0,
          arr: {
            "$objectToArray": "$$ROOT"
          }
        }
      },
      {
        "$unwind": "$arr"
      },
      {
        $match: {
          "arr.k": {
            $ne: "_id"
          }
        }
      },
      {
        $group: {
          _id: "$arr.k",
          values: {
            "$addToSet": "$arr.v"
          }
        }
      }
    ])
    

    Mongo Playground