MongoDB哈希表平均值

时间:2019-05-29 16:40:47

标签: c# mongodb mongodb-query mongodb-.net-driver

我正在将c#和MongoDB一起使用。 我有一堂课可以与此类似。 它是一个样本,代表某种东西,请不要在类设计上发表评论

[CollectionName("Venues")]
public class Venue
{
   public string Name { get; set; }
   public dictionary<string,object> Properties { get; set; }
}

var venue = new Venue
{
  Name = "Venue 1",
  Properties = new Dictionary<string,object>
  {
    { "Chairs", "18" },
    { "Tables", "4" },
    { "HasWaterfall", true }
  }
}

假设我在集合中有一个对象,看起来像那样。 我想发现有可能做两件事。

1:从数据库中加载,仅从字典中加载一项,    目前,我只能通过加载整个    从数据库中记录,然后通过键手动获取值。

2:确定数据库中单个项目的平均值。    例如,在所有记录中,我想计算出平均值    椅子,再次不加载所有记录,然后使用    linq等...

2 个答案:

答案 0 :(得分:1)

基本上,您的示例文档被存储为以下JSON:

{
    "_id" : ObjectId("..."),
    "Name" : "Venue 1",
    "Properties" : {
            "Chairs" : "18",
            "Tables" : "4",
            "HasWaterfall" : true
    }
}

这使您可以使用点符号来定义投影:

var filter = Builders<Venue>.Filter.Eq(f => f.Name, "Venue 1");
var projection = Builders<Venue>.Projection.Include("Properties.Chairs");

List<BsonDocument> data = Col.Find(filter).Project(projection).ToList();

在BsonDocument之后返回以下:

{ "_id" : ObjectId("..."), "Properties" : { "Chairs" : "18" } }

要获取平均值,您需要使用MongoDB 4.0中引入的$toInt运算符将值从字符串转换为int。试试:

var project = new BsonDocument()
{
    { "chairs", new BsonDocument() { { "$toInt", "$Properties.Chairs" } } }
};

var group = new BsonDocument()
{
    { "_id", "null" },
    { "avg", new BsonDocument() { { "$avg", "$chairs" }  } }
};

var avg = Col.Aggregate().Project(project).Group(group).First();

答案 1 :(得分:0)

这是使用MongoDB.Entities便捷库进行操作的另一种方法。

using System.Collections.Generic;
using System.Linq;
using MongoDB.Entities;

namespace StackOverflow
{
    class Program
    {
        [Name("Venues")]
        public class Venue : Entity
        {
            public string Name { get; set; }
            public Dictionary<string, object> Properties { get; set; }
        }

        static void Main(string[] args)
        {
            new DB("test");

            var venue1 = new Venue
            {
                Name = "Venue 1",
                Properties = new Dictionary<string, object>  {
                    { "Chairs", 28 },
                    { "Tables", 4 },
                    { "HasWaterfall", true }
                }
            };
            venue1.Save();

            var venue2 = new Venue
            {
                Name = "Venue 2",
                Properties = new Dictionary<string, object>  {
                    { "Chairs", 38 },
                    { "Tables", 4 },
                    { "HasWaterfall", true }
                }
            };
            venue2.Save();

            var chairs = DB.Find<Venue, object>()
                           .Match(v => v.Name == "Venue 1")
                           .Project(v => new { ChairCount = v.Properties["Chairs"] })
                           .Execute();

            var avgChairs = DB.Collection<Venue>()
                              .Average(v => (int)v.Properties["Chairs"]);

        }
    }
}

对数据库进行以下查询:

在会场1坐椅子

db.runCommand({
    "find": "Venues",
    "filter": {
        "Name": "Venue 1"
    },
    "projection": {
        "Properties.Chairs": NumberInt("1"),
        "_id": NumberInt("0")
    },
    "$db": "test"
})

获取所有场所的平均椅子数:

db.Venues.aggregate([
    {
        "$group": {
            "_id": NumberInt("1"),
            "__result": {
                "$avg": "$Properties.Chairs"
            }
        }
    }
])