【问题标题】:Avoiding duplicates when inserting multiple data into MongoDB向 MongoDB 中插入多个数据时避免重复
【发布时间】:2021-02-09 04:10:46
【问题描述】:

您好,我想在我的程序中插入多个数据并避免重复。我已经实现了使用 asp.net core web api 向 mongoDB 插入多个数据的代码,它工作正常。我尝试了很多东西,但仍然找不到在插入多条记录时避免重复记录的方法。你们能帮帮我吗:)

我想避免使用employeeid 插入重复项。

这是我的控制器

using HelloApi.Models;
using HelloApi.Services;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace HelloApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    [Produces("application/json")]
    public class EmployeeController : ControllerBase
    {
        private readonly EmployeeService _employeeService;

        public EmployeeController(EmployeeService employeeService)
        {
            _employeeService = employeeService;
        }

        //.....................................Create..............................................

        public Task Create(IEnumerable<Employee> employees)
        {
            return _employeeService.Create(employees);

        }
    }
}

这是我的模型类

using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using System.ComponentModel.DataAnnotations;

namespace HelloApi.Models
{
    public class Employee
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        [Key]
        public string Id { get; set; }

        [Required]
        [BsonElement("employeeid")]
        public string employeeid { get; set; }

        [Required]
        [BsonElement("firstname")]
        public string firstname { get; set; }

        [Required]
        [BsonElement("lastname")]
        public string lastname { get; set; }

        [Required]
        [BsonElement("age")]
        public int age { get; set; }

        [Required]
        [BsonElement("address")]
        public string address { get; set; }

        [Required]
        [BsonElement("telephone")]
        public int telephone { get; set; }

    }
}

这是我的服务类

using HelloApi.Models;
using MongoDB.Driver;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace HelloApi.Services
{
    public class EmployeeService
    {
        private readonly IMongoCollection<Employee> _employee;

        public EmployeeService(IHelloApiDatabaseSettings settings)
        {
            var client = new MongoClient(settings.ConnectionString);
            var database = client.GetDatabase(settings.DatabaseName);

            _employee = database.GetCollection<Employee>(settings.employeeCollectionName);
        }

        //.....................................Create..............................................

        public Task Create(IEnumerable<Employee> employees)
        {
            return _employee.InsertManyAsync(employees);
        }
    }
}

这是 Postman 中的 POST 请求,它工作正常,但提交重复。

如果你们能帮助我,真的很感激:)

【问题讨论】:

  • 删除重复项..?哪些属性...?您是否要删除重复的employeeid 或多个属性在API 编写您自己的逻辑并向客户端返回错误消息
  • 嗨,是的,我想通过查看 employeeid 来删除重复项。我不想两次插入相同的employeeid。
  • 嗨@Erik Khanpara 也许你可以帮我解决这个问题:)
  • public Task Create(IEnumerable employees) { // var employee get by id for employeeid //如果发现员工用现有员工创建新集合 //插入新员工 //更新现有员工员工}
  • 嗨@PrashanthReddy 我尝试以您的方式实现这一点,但在插入多个文档时仍然难以进行更新。你能给我一个实现的例子吗?

标签: c# mongodb asp.net-core asp.net-core-webapi


【解决方案1】:

这可能会有所帮助。使用下面的InsertORUpdateEmployee 函数来查找和更新使用employeeid。

public Task<string> Create(IEnumerable<Employee> employees)
{
    return Task.Run(() =>
    {
        return InsertORUpdateEmployee(employees);
    });
}

//Insert or Update Employees
private string InsertORUpdateEmployee(IEnumerable<Employee> employees)
{
    try
    {
        foreach (Employee emp in employees)
        {
            var empId = emp.employeeid;
            var DB = Client.GetDatabase("Employee");
            var collection = DB.GetCollection<Employee>("EmployeeDetails");
            
            //Find Employee using employeeid
            var filter_id = Builders<Employee>.Filter.Eq("employeeid", empId);
            var entity = collection.Find(filter_id).FirstOrDefault();
            //Insert
            if (entity == null)
            {
                collection.InsertOne(emp);
            }
            else
            {
                //Update
                var update = collection.FindOneAndUpdateAsync(filter_id, Builders<Employee>.Update
                    .Set("firstname", emp.firstname)
                    .Set("lastname", emp.lastname)
                    .Set("age", emp.age)
                    .Set("address", emp.address)
                    .Set("telephone", emp.telephone));
            }
        }
        return "Insert or Updated Succesfully";
    }

    catch (Exception ex)
    {
        return ex.ToString();
    }

}

【讨论】:

  • 天啊,非常感谢@Prashanth Reddy :) 成功了!
【解决方案2】:

我认为您需要添加一个额外的步骤来将您的 Id 字段声明为主键。 [Key] 应该只适用于 RDBMS。对于 MongoDB,我在这里找到了另一篇文章,将字段定义为唯一键。

(实际上,除了自动生成的 '_id' 字段之外,MongoDB 并不允许主键,afaik,但您可以创建唯一键。)

尝试浏览此处发布的答案: How to set a primary key in MongoDB?

【讨论】:

    【解决方案3】:

    看来您需要在employeeId 字段上创建唯一索引以避免重复:

     db.employee.createIndex( { "employeeId": 1 }, { unique: true } )
    

    【讨论】:

    • 嗨,是的,我想要的是避免插入相同的 employeeid 记录两次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    相关资源
    最近更新 更多