C # Как вставить массив в объект mongodb

#c# #arrays #mongodb

#c# #массивы #mongodb

Вопрос:

В настоящее время я работаю над приложением, использующим C #, где я хочу добавить некоторые данные в коллекцию MongoDB. Я пытаюсь добавить массив к объекту Employee, но я изо всех сил пытаюсь заставить его работать правильно.

Когда я просматриваю другие сообщения, я сталкиваюсь с синтаксисом, использующим BsonDocument, что-то вроде этого:

 var document = new BsonDocument {
{ "author", "joe" },
{ "comments", new BsonArray {
    new BsonDocument { { "author", "jim" }, { "comment", "I disagree" } },
    new BsonDocument { { "author", "nancy" }, { "comment", "Good post" } }
}}
 

Я хочу добавить массив в атрибут функции, чтобы добавить описание и другую подробную информацию.

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MongoDB.Driver;
using MongoDB.Bson;
using MongoDB.Driver.Core;

namespace Application
{
    class Program
    {
        public class Employee
        {
            public ObjectId Id { get; set; }
            public string BSN { get; set; }
            public string Name { get; set; }
            public string Function { get; set; 
        }

        static void Main(string[] args)
        {
            MongoClient client = new MongoClient();
            var server = client.GetServer();
            var db = server.GetDatabase("Database_Assignment");
            var collection = db.GetCollection<Employee>("Collection_Employees");

            Random random = new Random();

            List<string> names = new List<string>()        // Predefined list of names
            {
                "John Smith",
                "Matthew Williams",
                "David Harris",
                "Christopher Martin",
                "Paul Shark"
            };

            for (int i = 0; i < 5; i  )
            {
                int nameIndex      = random.Next(0, 5);         // Range in list of names
                int ageIndex       = random.Next(18, 67);       // Range for possible ages
                int funcIndex      = random.Next(0, 3);

                string nameValue   = names[nameIndex];         // Add index to string based on list of names
                string funcValue   = functions[funcIndex];     // Add index to string based on list of functions

                Employee employee = new Employee
                {
                    BSN = "BSN"   i,
                    Name = nameValue,
                    Function = funcValue
                };

                collection.Save(employee);
            }
        }
    }
}
 

Редактировать 1

Это то, что у меня сейчас есть скриншот

Это то, что я пытаюсь выполнить скриншот

Например, на втором скриншоте я хочу, чтобы ‘sensor_cole’ был функцией и добавил к нему некоторые конкретные детали. Надеюсь, это поможет.

Ответ №1:

Если вы хотите, чтобы функция была массивом, вы должны изменить его на это в своей модели, поскольку в настоящее время это просто строковое свойство, поэтому:

 public string[] Function { get; set; }
 

Если у сотрудника может быть более одной функции или

 public List<SomeFunctionObj> Function { get; set; 
 

Если они могут иметь несколько функций, и каждая функция имеет несколько свойств.

Взгляните на

 Builders<YourModel>.Update.Push
 

Вам нужно будет использовать метод обновления вместо сохранения в коллекции, если вы хотите обновить существующий элемент вместо его вставки.

В качестве альтернативы

 Builders<YourModel>.Update.AddToSet 
 

может быть более подходящим, если вы хотите добавить объект в массив

Я надеюсь, что это поможет, если я неправильно понял ваш вопрос, пожалуйста, дайте мне знать, и я изменю ответ по мере необходимости

Обновить

Если вы хотите добавить больше информации в функцию, вам нужно будет создать встроенную модель:

 public class Employee
{
    public ObjectId Id { get; set; }
    public string BSN { get; set; }
    public string Name { get; set; }
    public EmployeeFunction Function { get; set; 
}

public class EmployeeFunction 
{
    public string FunctionDesc { get; set; }
    public string MoreInfo { get; set; }
}
 

Итак, чтобы заполнить его, используя ваш пример кода:

 Employee employee = new Employee
            {
                BSN = "BSN"   i,
                Name = nameValue,
                Function = new EmployeeFunction 
                { 
                    FunctionDesc = funcValue, 
                    MoreInfo = "Some other info" 
                }
            };
 

Таким образом, ваш документ mongodb будет выглядеть примерно так:

 {
...
    "Function" : {
        "FunctionDesc" : "Developer",
        "MoreInfo" : "Some other info"
    },
...
}
 

Комментарии:

1. Спасибо за ответ. Мою программу не нужно обновлять каждый раз, пока достаточно просто вставить. Я отредактировал свой первоначальный пост, чтобы объяснить, чего я пытаюсь достичь.

2. Я обновил ответ, чтобы объяснить встроенную модель. Вот как вы можете сохранить дополнительную информацию в свойстве функции. Это одна из прелестей nosql, традиционно в СУБД для этого нам понадобится совершенно новая таблица и хранить внешний ключ для объекта Employee. С помощью MongoDB вы можете просто встроить его. Один из самых важных вопросов, который следует задать при принятии решения о встраивании или ссылке, — «как часто будут меняться встроенные данные», если они будут часто меняться, возможно, лучше всего подойдет традиционная ссылка, однако в данном случае я чувствую, что встраивание будет работать нормально.

3. Это именно то, что мне было нужно. Это сработало отлично. Большое вам спасибо!

4. Нет проблем, рад, что смог помочь