请使用AddToSet作为参数
,让sombody帮助我使用程序更新我的代码如下:
var ls = new Dictionary<string, string>();
foreach (var element in typeof(T).GetMembers())
{
var res = element.GetType().GetProperty(element.Name).GetValue(element.Name);
ls.Add(element.Name, res.ToString());
}
var result = await collection.UpdateOneAsync(
Builders<T>.Filter.Where(filter),
Builders<T>.Update.AddToSet(ls.Keys.ToString(), ls.Values));
我必须把第一个参数放在ls.key和ls.values上吗? 感谢
答案 0 :(得分:1)
假设您在Mongo中具有以下JSON
"Settings" : [
{
"ChannelType" : {
"_id" : 1,
"Name" : "NxtOne",
"Details" : "NxtOne Media Group",
},
"ChannelSubscribers" : ["20052"],
"ChannelDays" : 90,
"CreatedDate" : null,
}
],
#示例,如果要在mongo中更新“ ChannelSubscribers”和“ CreatedDate”。 您将如何在Builders的帮助下做到这一点?
注意:
#用于将通道“订户”添加到阵列列表中(使用 AddToSet opearator)
public async Task AddChannelSubscriberAsync(string accountId, short id, string userId)
{
var filter = BaseFilter(accountId) &
Builders<Channel>.Filter.ElemMatch(x => x.Settings, y => y.ChannelType.Id == id);
var update = Builders<Channel>.Update.AddToSet(${nameof(Channel.Settings)}.${nameof(Settings.ChannelSubscribers)}", userId);
await Collection.UpdateOneAsync(filter, update);
}
#用于从“订户”数组中删除值(使用 Pull 运算符)
public async Task AddChannelSubscriberAsync(string accountId, short id, string userId)
{
var filter = BaseFilter(accountId) &
Builders<Channel>.Filter.ElemMatch(x => x.Settings, y => y.ChannelType.Id == id); var update = Builders<Channel>.Update.Pull(${nameof(Channel.Settings)}.${nameof(Settings.ChannelSubscribers)}", userId);
await Collection.UpdateOneAsync(filter, update);
}
#用于更新“ CreatedDate”(使用 Set 运算符)
public async Task UpdateCreatedDateAsync(string accountId, Settings settings)
{
var filter = BaseFilter(accountId) & Builders<Account>.Filter.ElemMatch(x => x.Settings, y => y.ChannelType.Id == settings.ChannelType.Id);
var update =Builders<Channel>.Update.Set(${nameof(Channel.Settings)}.$.{nameof(Settings.CreatedDate)}", settings.CreatedDate);
await Collection.UpdateOneAsync(filter, update);
}
基本过滤器实现
public FilterDefinition<Channel> BaseFilter(string accId)
{
return Builders<Channel>.Filter.Eq(x => x.Id, accId) &
Builders<Channel>.Filter.Eq(c => c.Status,(int)StatusEnum.ActiveChannel);
}
答案 1 :(得分:-1)
经过深入调查后,我找到了解决方案,我将在此发布以分享知识
public class NeolineReorganizedMongoResult
{
public ObjectId _id { get; set; }
public List<string> DealerListAbout { get; set; }
}
public async Task<UpdateResult> Update(Expression<Func<T, bool>> filter,
T entity)
{
if (entity._id == null)
await Insert(entity);
var result = await collection.UpdateOneAsync(
Builders<T>.Filter.Where(filter),
Builders<T>.Update.Set(x => x.dealer_code, entity.dealer_code));
if (result.IsAcknowledged)
{
Console.WriteLine("Success");
}
return result;
}
var element = result.Result.Where(x => x.dealer_code.Trim() == "8888").FirstOrDefault();
if (element == null) return;
element.DealerListAbout = new List<string>
{
"Name1", "Name2", "Name3", "Name4"
};
foreach (var item in element.DealerListAbout)
{
using (Task updated = list.UpdateSetProperty(x => x.dealer_code.Equals("8888"), element.DealerListAbout, item))
{
updated.Wait();
if (!updated.IsFaulted)
{
Console.Write("Success");
var value = list.SearchFor(x => x.dealer_code.Equals("5430")).Result;
}
else
{
Console.Write("Failed");
}
}
}