Прежде всего, нет никаких отношений и объединений в mongodb. Все «отношения» логичны, но это не реальное отношение, как в базе данных SQL. В приведенном выше тесте вы дважды сохраняете человека: первый человек попадает в коллекцию людей, второй, я думаю, попадает во вложенную коллекцию людей в группе.
Вы просто дублированный человек. Итак, они не связаны. И если человек был обновлен в коллекции людей, это не значит, что он будет волшебным образом обновлен во вложенной коллекции людей в группе. По этой причине ваш тест не пройден.
Обычное отношение один ко многим в mongodb хорошо подходит для встраивания.
Обновление:
Я думаю, у вас есть такие документы:
public class Person
{
public Person()
{
Id = ObjectId.GenerateNewId().ToString();
}
[BsonId]
public string Id { get; set; }
public string Name { get; set; }
}
public class Group
{
public Group()
{
Id = ObjectId.GenerateNewId().ToString();
persons = new List<Person>();
}
[BsonId]
public string Id { get; set; }
public string Description { get; set; }
public List<Person> persons { get; set; }
public void Add(Person p)
{
persons.Add(p);
}
}
Также я немного изменил ваш тест, чтобы он заработал:
var database = _mongoServer.GetDatabase("StackoverflowExamples");
var p = new Person() { Name = "Testperson" };
var persons = database.GetCollection<Person>("Persons");
persons.Save<Person>(p);
var group = new Group() { Description = "A fancy descriptor" };
group.Add(p);
var groups = database.GetCollection<Group>("Groups");
groups.Save<Group>(group);
//Groups collection
//{
// "_id": "4da54d3c00a9ec06a0067456",
// "Description": "A fancy descriptor",
// "persons": [
// {
// "_id": "4da54d3b00a9ec06a0067455",
// "Name": "Testperson"
// }
// ]
//}
//Persons collection
//{
// "_id": "4da54d3b00a9ec06a0067455",
// "Name": "Testperson"
//}
var readPerson = persons.FindOneById(p.Id);
readPerson.Name = "a different name";
//Here i've changed Insert to Save
persons.Save(readPerson);
//Here you updating person in persons collection,
//but within group name still old
//Persons collection
//{
// "_id": "4da54d3b00a9ec06a0067455",
// "Name": "a different name"
//}
//So to achieve 'physical relation' you need also update person within group
var query = Query.EQ("persons._id", readPerson.Id);
groups.Update(query, Update.Set("persons.$.Name", readPerson.Name));
//Groups collection
//{
// "_id": "4da54d3c00a9ec06a0067456",
// "Description": "A fancy descriptor",
// "persons": [
// {
// "_id": "4da54d3b00a9ec06a0067455",
// "Name": "a different name"
// }
// ]
//}
//Test passed
var readGroup = groups.FindOneById(group.Id);
Assert.AreEqual(readPerson.Id, readGroup.persons[0].Id);
Assert.AreEqual(readPerson.Name, readGroup.persons[0].Name);