c#mongodb如何按id搜索并按字符串数组过滤
我的数据库中有一个类似这样的对象c#mongodb如何按id搜索并按字符串数组过滤,c#,mongodb,mongodb-.net-driver,asp.net-core-3.1,C#,Mongodb,Mongodb .net Driver,Asp.net Core 3.1,我的数据库中有一个类似这样的对象 { "_id":{ "$oid":"5e9de27a4f55601268115efd" }, "UserId":"5e8f649853ed63a6bcf3b22c", "Picture":"/picture/123", "Name":"Test Post APi", "Body":"Testing api", "Likes":[ "5e91f4a9839b426c8cc942b7",
{
"_id":{
"$oid":"5e9de27a4f55601268115efd"
},
"UserId":"5e8f649853ed63a6bcf3b22c",
"Picture":"/picture/123",
"Name":"Test Post APi",
"Body":"Testing api",
"Likes":[
"5e91f4a9839b426c8cc942b7",
"5e91f4a98395e91f4a9839bs4",
"5e91f4a98395e91f4a98332dg"
],
"DatePosted":{
"$date":{
"$numberLong":"1587411900296"
}
}
}
当有人喜欢一篇文章时,我尝试通过postId查询我的post对象,并签入likes userId数组(如果它包含userId),然后从数组中删除该userId(不类似),或者将其(类似)添加到数组中(如果不存在)。这些是我目前所拥有的,但它不起作用,有什么帮助吗
UpdateDefinition<Post> newPostValues;
var findId = Builders<Post>.Filter.Eq("_id", request.Id);
var findLike = Builders<Post>.Filter.ElemMatch(x => x.Likes, x => x == request.PostUserId);
var combineFilters = Builders<Post>.Filter.And(findId, findLike);
var post = await _context.Posts.Find(combineFilters).SingleOrDefaultAsync();
// set value to add like to post
if (post == null)
{
newPostValues = Builders<Post>.Update.Push(p => p.Likes, request.UserId);
}
// set new value to remove like from post
else
{
newPostValues = Builders<Post>.Update.PullFilter(p => p.Likes,
l => l == request.PostUserId);
}
var result = await _context.Posts.UpdateOneAsync(e => e.Id == request.Id, newPostValues);
我已通过执行以下操作解决了此问题
var post = await _context.Posts.Find(x => x.Id == request.Id).SingleOrDefaultAsync();
// add/remove likes from post
var newLikeValue = post.Likes.Contains(request.UserId) ? Builders<Post>.Update.Pull(p => p.Likes, request.UserId) : Builders<Post>.Update.Push(p => p.Likes, request.UserId);
var result = await _context.Posts.UpdateOneAsync(e => e.Id == request.Id, newLikeValue);
var post=await\u context.Posts.Find(x=>x.Id==request.Id).SingleOrDefaultAsync();
//从帖子中添加/删除喜欢的内容
var newLikeValue=post.Likes.Contains(request.UserId)?Builders.Update.Pull(p=>p.Likes,request.UserId):Builders.Update.Push(p=>p.Likes,request.UserId);
var result=await\u context.Posts.UpdateOneAsync(e=>e.Id==request.Id,newLikeValue);
我已通过执行以下操作修复了此问题
var post = await _context.Posts.Find(x => x.Id == request.Id).SingleOrDefaultAsync();
// add/remove likes from post
var newLikeValue = post.Likes.Contains(request.UserId) ? Builders<Post>.Update.Pull(p => p.Likes, request.UserId) : Builders<Post>.Update.Push(p => p.Likes, request.UserId);
var result = await _context.Posts.UpdateOneAsync(e => e.Id == request.Id, newLikeValue);
var post=await\u context.Posts.Find(x=>x.Id==request.Id).SingleOrDefaultAsync();
//从帖子中添加/删除喜欢的内容
var newLikeValue=post.Likes.Contains(request.UserId)?Builders.Update.Pull(p=>p.Likes,request.UserId):Builders.Update.Push(p=>p.Likes,request.UserId);
var result=await\u context.Posts.UpdateOneAsync(e=>e.Id==request.Id,newLikeValue);
使用单个更新查询可能有助于完成此任务。这不是c#虽然。也许将有助于完成它使用一个单一的更新查询。但这不是c#。