使用AddToSet进行Mongo UpdateOneAsync的C#代码

时间:2015-05-14 15:16:21

标签: c# .net mongodb mongodb-.net-driver

请使用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上吗? 感谢

2 个答案:

答案 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 运算符。
  • 对于下一个仅是属性的项目“ CreatedDate”,然后 使用Set 运算符。

#用于将通道“订户”添加到阵列列表中(使用 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");
                }
            }
        }