#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. Нет проблем, рад, что смог помочь