查询 MongoDB C#:如何在 BsonDocument 中提取调用聚合方法产生的字段?
Query MongoDB C#: how can I extract in a BsonDocument the field that results from calling aggregate method?
我有 2 个合集 "images" 和 "user_preff"。
在我的应用中:
- "images"包含"file_name"和"data"(字节数组)
- "user_preff" 包含 "username"(喜欢该图片的用户)和 "file_name"
我想做的是加入这个合集,我想展示用户喜欢的图片。
我正在使用这个:
var documents = collection.Aggregate().Match(filter).Lookup("images", "file_name", "file_name", "common").As<BsonDocument>().Match(new BsonDocument()).ToList();
现在野外普通就是我想要的。我怎样才能将该数据提取到另一个 BsonDocument 中?
您可以将二进制文件存储为 BinData
,并使用以下代码读取值。投影用于 select 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;
}
}
}
我有 2 个合集 "images" 和 "user_preff"。
在我的应用中:
- "images"包含"file_name"和"data"(字节数组)
- "user_preff" 包含 "username"(喜欢该图片的用户)和 "file_name"
我想做的是加入这个合集,我想展示用户喜欢的图片。
我正在使用这个:
var documents = collection.Aggregate().Match(filter).Lookup("images", "file_name", "file_name", "common").As<BsonDocument>().Match(new BsonDocument()).ToList();
现在野外普通就是我想要的。我怎样才能将该数据提取到另一个 BsonDocument 中?
您可以将二进制文件存储为 BinData
,并使用以下代码读取值。投影用于 select 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;
}
}
}