查询MongoDB C#:如何在BsonDocument中提取调用聚合方法所产生的字段?

问题描述 投票:0回答:1

我有2个收藏集“图像”和“ user_preff”。

在我的应用中:

  • “图像”包含“文件名”和“数据”(字节数组)
  • “ user_preff”包含“用户名”(喜欢该图像的用户)和“文件名”

我想加入这个收藏集,我想显示用户喜欢的图像。

我正在使用这个:

var documents = collection.Aggregate().Match(filter).Lookup("images", "file_name", "file_name", "common").As<BsonDocument>().Match(new BsonDocument()).ToList();

现在我想要的是普通领域。如何将这些数据提取到另一个BsonDocument中?

c# asp.net mongodb mongodb-query mongodb-.net-driver
1个回答
0
投票

您可以将二进制存储为BinData,并使用以下代码读取值。用于选择data列的投影重命名该字段,如果需要的话。

string connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);
var db = client.GetDatabase("test");
//var images = db.GetCollection<BsonDocument>("images");
var userPreff = db.GetCollection<BsonDocument>("user_preff");
//images.InsertOne(BsonDocument.Parse("{\"file_name\": \"bus.jpg\", \"data\": BinData(0, \"...\")}"));
//userPreff.InsertOne(BsonDocument.Parse("{\"username\": \"ntohl\", \"file_name\": \"bus.jpg\"}"));
var filter = Builders<BsonDocument>.Filter.Empty;
var documents = userPreff.Aggregate().Match(filter).Lookup("images", "file_name", "file_name", "common")
    .Project("{\"imagesOfUser\": \"$common.data\"}").ToCursor();
while (documents.MoveNext())
{
    foreach (BsonDocument bsonDocument in documents.Current)
    {
        foreach (var image in bsonDocument["imagesOfUser"].AsBsonArray)
        {
            byte[] bytes = image.AsBsonBinaryData.Bytes;
        }
    }
}

如果不需要重命名,您可以使用更简单的投影方法:

var documents = userPreff.Aggregate().Match(filter).Lookup("images", "file_name", "file_name", "common")
    .Project("{\"_id\": 0, \"common.data\": 1}").ToCursor();
while (documents.MoveNext())
{
    foreach (BsonDocument bsonDocument in documents.Current)
    {
        foreach (var common in bsonDocument["common"].AsBsonArray)
        {
            byte[] bytes = common["data"].AsBsonBinaryData.Bytes;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.