【问题标题】:Azure CosmosDB using Mongo Drivers: Get Count With out getting all documents based on element in sub sub document in C#.Net使用 Mongo 驱动程序的 Azure Cosmos DB:获取计数而不获取基于 C#.Net 中子子文档中的元素的所有文档
【发布时间】:2017-12-04 07:24:26
【问题描述】:

下面是我存储在 Azure MongoDB 中的 JSON 结构(粘贴了示例结构),我想使用 Plyrs 中存在的 userID 元素进行查询( Sub Sub 文档)获取用户参加过的所有锦标赛的列表。

  1. 我已尝试使用 Aggregate() 但未成功。请纠正我 如果我遗漏了一些东西,下面是它的代码。

  2. 尝试使用构建器但未成功,使用构建器我最多可以检索一个级别(子集合,json(粘贴在下面)引用到 tbls )在那里我可以在 Plyrs(子子集合)上查询的任何方式。

  3. Azure MongoDB 是否支持 Aggregate() 或计数而不获取整个文档?

请指导我聚合

   var count = sampleMongoDataBase.GetCollection<GameInfo>(sampleCollectionName).Aggregate()
                    .Unwind<GameInfo, TableDocumet>(t => t.Tables)
                    .Unwind<TableDocumet, PlayerDocument>(p => p.Players)
                   .Match(x => x.UserID == "3fd30fa8-f5c5-4311-8741-4032142bbb33")
                   .Group(new MongoDB.Bson.BsonDocument { { "id", "$Plyrs._id" }, { "count", new MongoDB.Bson.BsonDocument("$sum", 1) } }); 

建设者

 mongoDataBase.GetCollection<GameInfo>(mongoCollectionName).Find(Builders<GameInfo>.Filter.ElemMatch(x => x.Tables,t => t.TableId == 1)).Count();

错误: 命令聚合失败:不支持“$group”。

JSON:

`

{
"TnId": 651,
"QnId": "7a5de5dc-b02f-4013-9d02-ebf8430e7a56",
"samt": 10,
"tbls": [
  {
    "TblId": 1,
    "Plyrs": [
      {
        "_id": 1048995,
        "UserId": "FC381A6D717B6973-711BD743AE90E6D7",
        "St": 3,
        "PCS": 2,
        "ConnId": null,
        "DN": "Roman Yates",
        "RB": 2,
        "LL": 1,
        "Chips": 5000,
        "Rank": 46,
        "ExitLvl": 0,
        "TRA": 0,
        "PRI": "",
        "IsAns": false
      },
      {
        "_id": 1048996,
        "UserId": "fc3e0971-2c3c-e697-b68a-33b12a207bc2",
        "St": 3,
        "PCS": 2,
        "ConnId": null,
        "DN": "Neil Gaines",
        "RB": 2,
        "LL": 1,
        "Chips": 5000,
        "Rank": 46,
        "ExitLvl": 0,
        "TRA": 0,
        "PRI": "",
        "IsAns": false
      },
      {
        "_id": 1048997,
        "UserId": "FC369812-6DC04066-A133-1C10EEBA1546",
        "St": 3,
        "PCS": 2,
        "ConnId": null,
        "DN": "Lori Reyes",
        "RB": 2,
        "LL": 1,
        "Chips": 5000,
        "Rank": 46,
        "ExitLvl": 0,
        "TRA": 0,
        "PRI": "",
        "IsAns": false
      },
      {
        "_id": 1048998,
        "UserId": "FC2AC461-C7FAD800D3D79A2CD2680C72",
        "St": 3,
        "PCS": 2,
        "ConnId": null,
        "DN": "Duane Hoffman",
        "RB": 2,
        "LL": 1,
        "Chips": 5000,
        "Rank": 46,
        "ExitLvl": 0,
        "TRA": 0,
        "PRI": "",
        "IsAns": false
      },
      {
        "_id": 1048999,
        "UserId": "FC39AFCF-688C-B61A-A0DB-80EADAC832CD",
        "St": 3,
        "PCS": 2,
        "ConnId": null,
        "DN": "Alfredo Ware",
        "RB": 2,
        "LL": 1,
        "Chips": 5000,
        "Rank": 46,
        "ExitLvl": 0,
        "TRA": 0,
        "PRI": "",
        "IsAns": false
      },
      {
        "_id": 1049000,
        "UserId": "FC2B863D-9ACC-13C706EA-8E31917566DB",
        "St": 3,
        "PCS": 2,
        "ConnId": null,
        "DN": "Abigail Riddle",
        "RB": 2,
        "LL": 1,
        "Chips": 5000,
        "Rank": 46,
        "ExitLvl": 0,
        "TRA": 0,
        "PRI": "",
        "IsAns": false
      }
    ]
  },
  {
    "TblId": 2,
    "Plyrs": [
      {
        "_id": 1049001,
        "UserId": "FC2BCC93-DDAE-4622-8D1226BDF1181D63",
        "St": 3,
        "PCS": 2,
        "ConnId": null,
        "DN": "Rene Spence",
        "RB": 2,
        "LL": 1,
        "Chips": 5000,
        "Rank": 46,
        "ExitLvl": 0,
        "TRA": 0,
        "PRI": "",
        "IsAns": false
      },
      {
        "_id": 1049002,
        "UserId": "FC3D0CF42017-C3BFF460-E8DBDE3D1D77",
        "St": 3,
        "PCS": 2,
        "ConnId": null,
        "DN": "TU006918",
        "RB": 2,
        "LL": 1,
        "Chips": 5000,
        "Rank": 46,
        "ExitLvl": 0,
        "TRA": 0,
        "PRI": "",
        "IsAns": false
      },
      {
        "_id": 1049003,
        "UserId": "FC2CDE495F34E557-77C8-4B10981B7758",
        "St": 3,
        "PCS": 2,
        "ConnId": null,
        "DN": "Marshall Lutz",
        "RB": 2,
        "LL": 1,
        "Chips": 5000,
        "Rank": 46,
        "ExitLvl": 0,
        "TRA": 0,
        "PRI": "",
        "IsAns": false
      },
      {
        "_id": 1049004,
        "UserId": "FC3EE1FDB4913FF345AE90CD14BE3607",
        "St": 3,
        "PCS": 2,
        "ConnId": null,
        "DN": "Roberto Burton",
        "RB": 2,
        "LL": 1,
        "Chips": 5000,
        "Rank": 46,
        "ExitLvl": 0,
        "TRA": 0,
        "PRI": "",
        "IsAns": false
      },
      {
        "_id": 1049005,
        "UserId": "FC378E3C-C2A0528F094A-7FB31BD9D278",
        "St": 3,
        "PCS": 2,
        "ConnId": null,
        "DN": "Summer Stephenson",
        "RB": 2,
        "LL": 1,
        "Chips": 5000,
        "Rank": 46,
        "ExitLvl": 0,
        "TRA": 0,
        "PRI": "",
        "IsAns": false
      },
      {
        "_id": 1049006,
        "UserId": "FC431BBB-A79D45A0EAB034676C755E5A",
        "St": 3,
        "PCS": 2,
        "ConnId": null,
        "DN": "Terence Fischer",
        "RB": 2,
        "LL": 1,
        "Chips": 5000,
        "Rank": 46,
        "ExitLvl": 0,
        "TRA": 0,
        "PRI": "",
        "IsAns": false
      }
    ]
  }

输出: 例如,计数:5

【问题讨论】:

  • 您能否澄清一下这是本机 MongoDB 还是带有 MongoDB API 的 CosmosDB?您没有显示任何错误输出,因此无法判断。
  • 嗨,David Makogon,它是带有 MongoDB API 的 CosmosDB。使用 C#.Net 命令聚合在 Cosmos 上查询失败时出现此错误:不支持“$group”。
  • 您必须在 Azure 门户(预览功能窗格)上为您的 Cosmos DB MongoDB API 帐户打开聚合管道。
  • @user3270152 - 请查看我的更新答案,这反映了聚合管道现在是受支持的功能这一事实。

标签: mongodb azure azure-cosmosdb


【解决方案1】:

并非所有 MongoDB 查询功能都在 Cosmos MongoDB API 中出现,目前聚合管道是未实现的功能之一。这就是为什么您会收到错误消息,指出不支持 $group

编辑 - 截至 2017 年 11 月,聚合管道现在是 Cosmos DB 的 MongoDB API 支持的操作。支持的功能的完整列表是here

一般聚合 (sum, min, max, avg, count) 不久前被添​​加到 DocumentDB API。

目前,您必须在 MongoDB API 中进行自己的聚合。

注意:支持count(),因此假设您过滤数据(没有聚合管道),您可以执行以下操作:

db.collection.find({...}).count()

同样,您可以通过排序执行$min$max。所以对于$max,你可以这样来求foo的最大值:

db.collection.find({...},{foo:1}).sort({foo:-1}).limit(1)

【讨论】:

  • 感谢 David Makogon 的回复,我正在尝试使用构建器,但我只能上一层,有什么方法可以让我上两层来访问玩家对象。 mongoDataBase.GetCollection(mongoCollectionName).Find(Builders.Filter.ElemMatch(x => x.Tables,t => t.TableId == 1)).Count();
【解决方案2】:

对 Cosmos DB 的聚合管道支持处于私人预览阶段。请随时与团队或我联系,为您的数据库启用它。

【讨论】:

  • 谢谢 Andy Hoh,它也可用于 MongoDB API 吗?是否需要额外收费?
  • 是的,它仅适用于 MongoDB API。它不收取任何额外费用。我们可以让您参加私人预览,请随时与我联系(在个人资料中发送电子邮件)。
  • 谢谢安迪,第二天就在我的订阅中启用了这个,错过了在这里更新。但聚合不适用于子文档。
猜你喜欢
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 2021-12-16
  • 1970-01-01
  • 2017-12-19
相关资源
最近更新 更多