我如何 select 列表中的对象 MongoDB MVC
How do I select an object from a list MongoDB MVC
我有以下数据结构:
[
{
"id": "604ab2c4a568b9181987c9eb",
"name": "Paul",
"eventDate": "2021-03-12T00:16:03.672Z",
"created": "2021-03-12T00:16:03.673Z",
"images": [
{
"id": "604ab2c3a568b9181987c603",
"name": "DSC_0",
"url": "https://picsum.photos/300/300",
"isSelected": true
},
...
]
},
{
"id": "604ab3889c5ac2289b450e3c",
"name": "Paul",
"eventDate": "2021-03-12T00:16:03.672Z",
"created": "2021-03-12T00:16:03.673Z",
"images": [
{
"id": "604ab3879c5ac2289b450a54",
"name": "DSC_0",
"url": "https://picsum.photos/300/300",
"isSelected": true
},
...
]
},
...
]
我正在尝试通过用户 ID 和图像 ID 获取图像,但由于某些原因我不能
var filter = Builders<Client>.Filter.Eq("Id", "604ab2c4a568b9181987c9eb");
filter &= Builders<Client>.Filter.ElemMatch(u => u.Images,t => t.Id == "604ab2c3a568b9181987c603");
return _client.Find(filter).FirstOrDefault();
这将返回所有 ID 为“604ab2c4a568b9181987c9eb”的文档,但我只想接收 ID 为“604ab2c3a568b9181987c603”的图像
这里是对象的模型:
public class Client
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("name")]
public string Name { get; set; }
[BsonElement("eventDate")]
[BsonDateTimeOptions]
public DateTime EventDate { get; set; }
[BsonElement("created")]
[BsonDateTimeOptions]
public DateTime Created { get; set; }
[BsonElement("images")]
public List<Image> Images { get; set; }
}
public class Image
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("name")]
public string Name { get; set; }
[BsonElement("url")]
[DataType(DataType.ImageUrl)]
public string Url { get; set; }
[BsonElement("isSelected")]
public bool IsSelected { get; set; }
}
所以我想知道如何修复我的代码,让它只返回一张图片,或者返回来自正在搜索的用户的多张图片。
最后但同样重要的是,我想知道我是否可以更改 isSelected 值,即使我使用的是相同的过滤器。
您想使用投影来仅请求具有给定 ID 的特定图像。所以查询看起来像>
var client = new MongoClient();
var database = client.GetDatabase("test");
var collection = database.GetCollection<Client>("clients");
//collection.InsertOne(new Client
//{
// Created = DateTime.Now,
// EventDate = DateTime.Now,
// Name = "myClient",
// Images = new List<Image>
// {
// new Image
// {
// Id = ObjectId.GenerateNewId(DateTime.Now).ToString(),
// Name = "Image1",
// IsSelected = true,
// Url = "myUrl1"
// },
// new Image
// {
// Id = ObjectId.GenerateNewId(DateTime.Now).ToString(),
// Name = "Image2",
// IsSelected = true,
// Url = "myUrl2"
// }
// }
//});
var filter = Builders<Client>.Filter.Eq("Id", "605a60a76b25fefcc3b1bc00");
var imageFilter = Builders<Image>.Filter.Eq("Id", "605a60a76b25fefcc3b1bbff");
var projection = (ProjectionDefinition<Client, Client>)Builders<Client>.Projection.ElemMatch("Images", imageFilter);
var image = collection.Find(filter).Project(projection).FirstOrDefault() // here you have the specific client with only the right Image in the Images. Other props are default.
?.Images?[0]; // selecting the only Image in the list.
抱歉,更新部分没那么简单。采取完全不同的方法>
var filter = Builders<Client>.Filter.Eq(x => x.Id, "605a60a76b25fefcc3b1bc00");
var update = Builders<Client>.Update.Set("images.$[f].isSelected", false);
var arrayFilters = new[]
{
new BsonDocumentArrayFilterDefinition<BsonDocument>(
new BsonDocument("f._id", BsonObjectId.Create("605a60a76b25fefcc3b1bbff")))
};
collection.UpdateOne(filter, update, new UpdateOptions { ArrayFilters = arrayFilters });
主要取自https://kevsoft.net/2020/03/23/updating-arrays-in-mongodb-with-csharp.html
我有以下数据结构:
[
{
"id": "604ab2c4a568b9181987c9eb",
"name": "Paul",
"eventDate": "2021-03-12T00:16:03.672Z",
"created": "2021-03-12T00:16:03.673Z",
"images": [
{
"id": "604ab2c3a568b9181987c603",
"name": "DSC_0",
"url": "https://picsum.photos/300/300",
"isSelected": true
},
...
]
},
{
"id": "604ab3889c5ac2289b450e3c",
"name": "Paul",
"eventDate": "2021-03-12T00:16:03.672Z",
"created": "2021-03-12T00:16:03.673Z",
"images": [
{
"id": "604ab3879c5ac2289b450a54",
"name": "DSC_0",
"url": "https://picsum.photos/300/300",
"isSelected": true
},
...
]
},
...
]
我正在尝试通过用户 ID 和图像 ID 获取图像,但由于某些原因我不能
var filter = Builders<Client>.Filter.Eq("Id", "604ab2c4a568b9181987c9eb");
filter &= Builders<Client>.Filter.ElemMatch(u => u.Images,t => t.Id == "604ab2c3a568b9181987c603");
return _client.Find(filter).FirstOrDefault();
这将返回所有 ID 为“604ab2c4a568b9181987c9eb”的文档,但我只想接收 ID 为“604ab2c3a568b9181987c603”的图像
这里是对象的模型:
public class Client
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("name")]
public string Name { get; set; }
[BsonElement("eventDate")]
[BsonDateTimeOptions]
public DateTime EventDate { get; set; }
[BsonElement("created")]
[BsonDateTimeOptions]
public DateTime Created { get; set; }
[BsonElement("images")]
public List<Image> Images { get; set; }
}
public class Image
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("name")]
public string Name { get; set; }
[BsonElement("url")]
[DataType(DataType.ImageUrl)]
public string Url { get; set; }
[BsonElement("isSelected")]
public bool IsSelected { get; set; }
}
所以我想知道如何修复我的代码,让它只返回一张图片,或者返回来自正在搜索的用户的多张图片。
最后但同样重要的是,我想知道我是否可以更改 isSelected 值,即使我使用的是相同的过滤器。
您想使用投影来仅请求具有给定 ID 的特定图像。所以查询看起来像>
var client = new MongoClient();
var database = client.GetDatabase("test");
var collection = database.GetCollection<Client>("clients");
//collection.InsertOne(new Client
//{
// Created = DateTime.Now,
// EventDate = DateTime.Now,
// Name = "myClient",
// Images = new List<Image>
// {
// new Image
// {
// Id = ObjectId.GenerateNewId(DateTime.Now).ToString(),
// Name = "Image1",
// IsSelected = true,
// Url = "myUrl1"
// },
// new Image
// {
// Id = ObjectId.GenerateNewId(DateTime.Now).ToString(),
// Name = "Image2",
// IsSelected = true,
// Url = "myUrl2"
// }
// }
//});
var filter = Builders<Client>.Filter.Eq("Id", "605a60a76b25fefcc3b1bc00");
var imageFilter = Builders<Image>.Filter.Eq("Id", "605a60a76b25fefcc3b1bbff");
var projection = (ProjectionDefinition<Client, Client>)Builders<Client>.Projection.ElemMatch("Images", imageFilter);
var image = collection.Find(filter).Project(projection).FirstOrDefault() // here you have the specific client with only the right Image in the Images. Other props are default.
?.Images?[0]; // selecting the only Image in the list.
抱歉,更新部分没那么简单。采取完全不同的方法>
var filter = Builders<Client>.Filter.Eq(x => x.Id, "605a60a76b25fefcc3b1bc00");
var update = Builders<Client>.Update.Set("images.$[f].isSelected", false);
var arrayFilters = new[]
{
new BsonDocumentArrayFilterDefinition<BsonDocument>(
new BsonDocument("f._id", BsonObjectId.Create("605a60a76b25fefcc3b1bbff")))
};
collection.UpdateOne(filter, update, new UpdateOptions { ArrayFilters = arrayFilters });
主要取自https://kevsoft.net/2020/03/23/updating-arrays-in-mongodb-with-csharp.html