#c# #mongodb #nosql
#c# #mongodb #nosql
Вопрос:
У меня есть документ, в котором есть встроенный массив блоков, например, этот:
{
"_id" : ObjectId("5807c22e959ca231f0c48a75"),
"Code" : "Value",
"Units" : [
{
"_id" : ObjectId("5807cc08959ca331f09c530e"),
"Code" : "Foo",
"Label" : "Foo"
},
{
"_id" : ObjectId("5807cc08959ca331f09c530e"),
"Code" : "Bar",
"Label" : "Bar"
},
]
}
Я хочу найти единицу по ее идентификатору и заменить ее новым документом.
Как я мог бы это сделать, используя драйвер Mongo C # 2.0?
Заранее спасибо!
Комментарии:
1. что вы уже сделали?
2. Если бы мой ответ помог вам, возможно, вы могли бы принять его как ответ с отметкой и проголосовать, если считаете, что это может быть полезно другим. Я говорю это только потому, что заметил, что вы здесь новичок
Ответ №1:
Спасибо, ребята. Из ваших ответов я пришел к следующему решению:
var mainDocumentId = "5807c22e959ca231f0c48a75";
var arrayItemId = "5807cc08959ca331f09c530e"; //Id for foo
var unit = new Unit(...)
var filter = Builders<UnitType>.Eq(o => o.Id, mainDocumentId); // optional
filter amp;= Builders<UnitType>.Filter.ElemMatch(o => o.Units, o => o.Id == arrayItemId);
var update = Builders<UnitType>.Update.Set(o => o.Units[-1], unit);
collection.UpdateOne(filter, update);
Ответ №2:
Предполагая, что ваши модели на C # выглядят следующим образом:
public class UnitLog
{
[BsonRepresentation(BsonType.ObjectId)]
[BsonId]
public string Id { get; set; }
public string Code { get; set; }
public List<Unit> Units { get; set; }
}
public class Unit
{
[BsonRepresentation(BsonType.ObjectId)]
[BsonId]
public string Id { get; set; }
public string Code { get; set; }
public string Label { get; set; }
}
Вы могли бы использовать PullFilter для извлечения элемента из встроенного массива. Вот пример с драйвером MongoDB 2.0:
var mainDocumentId = "5807c22e959ca231f0c48a75";//Your containing document's Id
var arrayItemId = "5807cc08959ca331f09c530e";//Id for array item with Code=foo
var pullFilter = Builders<UnitLog>.Update.PullFilter(
x => x.Units,
x => x.Id == arrayItemId
);
//Note that you would use Collection.UpdateManyAsync()
//if you expected more than one item to be updated/pulled
var result = await Collection.UpdateOneAsync(
x => x.Id == mainDocumentId,
pullFilter
).ConfigureAwait(false);
Для идентификации элементов во встроенном массиве вы должны использовать $elemMatch для этого
elemMatch документация MongoDB
Можно найти соответствие элементам
Builders<UnitLog>.Filter.ElemMatch
И может использоваться совместно с $set для обновления отдельных свойств встроенных документов, определенных с помощью $elemMatch.
Загляните в addToSet, вы можете найти это полезным, поскольку он добавляет элемент в массив, если элемент уже не существует
Добавить документацию по MongoDB
Можно найти addToSet
Builders<UnitLog>.Update.AddToSet