Как отправить список <> в поддокумент в mongodb? - PullRequest
2 голосов
/ 04 июня 2011

Я пытаюсь выдвинуть список к вложенному документу.Если я вставляю только один объект как BsonDocument, он работает, как показано ниже:

BsonDocument subdoc = new BsonDocument {
                 { "_id", ObjectId.GenerateNewId()},
                 {"name", "Mr Bob"}
                };

                var query = Query.EQ("_id", new ObjectId("1234.."));
                var upd = Update.Push("members", subdoc); <-works
                groups.Update(query, upd);

Но мне нужно нажать Список.Я получаю это исключение:

"WriteStartArray cannot be called when State is: Initial"

Это код ошибки:

List<BsonDocument> newMembers = new List<BsonDocument>();
BsonDocument subdoc  = new BsonDocument {
                     { "_id", ObjectId.GenerateNewId()},
                     {"name", "Mr Bob"}
                    };
newMembers.Add(subdoc );
subdoc = new BsonDocument {
                     { "_id", ObjectId.GenerateNewId()},
                     {"name", "Mr Tom"}
                    };                
newMembers.Add(subdoc);

var query = Query.EQ("_id", new ObjectId(id));
var upd = Update.Push("members", newMembers.ToBsonDocument()); <- EXCEPTION
groups.Update(query, upd);

После вставки я вижу:

groups:
{
  _id:1,
  members:[
   {   
      _id:1,
      name: "Mr Bob"
   },
   {   
      _id:1,
      name: "Mr Tom"
   }
  ]
}

1 Ответ

1 голос
/ 04 июня 2011

Поскольку newMembers уже имеет список BsonDocument, вам не нужно снова преобразовывать его в BsonDocument.

Если вы хотите поместить более одного документа во вложенный массив, вам нужно использовать $ pushAll :

var upd = Update.PushAll("members", newMembers.ToArray());

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

Допустим, что newMembers является классом List of Member, а затем, если вам нужно отправить List во вложенный массив, вы должны сделать что-то вроде этого:

var upd = Update.PushAll("members", newMembers.Select(x=> x.ToBsonDocument()).ToArray());

Обновление:

  1. Чтобы сделать поддокумент не уникальным для одних и тех же имен пользователей, вы можете создать алгоритм, который будет генерировать один и тот же идентификатор из тех же имен пользователей. Самый простой алгоритм может просто заменить все пробелы подчеркиванием и сделать ToLower ().
  2. Другой способ загрузить массив embedd с помощью $slice и проверить уникальность каждого вложенного документа.
...