MongoDB / C # API - Как определить, существует ли вложенный документ - PullRequest
0 голосов
/ 19 января 2012

В новостной ленте есть несколько «лайков»

"Likes" : [

{
    userid: ObjectId(ae12bcd323421223),
    username: "user1",
    likedate: ISODATE(xxx)
},

{
    userid: ObjectId(ae12bcd323421224),
    username: "user2",
    likedate: ISODATE(xxx)
}


]

Человеку может понравиться публикация только один раз, поэтому ее идентификатор / имя пользователя должны быть уникальными.

Я пробовалAddToSetWrapped - но он, очевидно, завершается ошибкой, потому что DateTime отличается, и он все равно добавляет объект.В настоящее время у меня нет уникальных индексов в массиве, но я могу изменить их при необходимости?

Как проверить наличие определенного идентификатора пользователя в массиве Likes и добавить его только в том случае, если идентификатор пользователя еще не существует?(или как одна атомарная операция, или как две операции)?

1 Ответ

1 голос
/ 19 января 2012

Человеку может понравиться сообщение только один раз, поэтому идентификатор пользователя / имя пользователя должны быть уникальными. [...] В настоящее время у меня нет уникальных индексов в массиве, но я могу изменить это при необходимости?

Обратите внимание, что уникальные ключи не охватывают этот сценарий. Документ в MongoDB никогда не сможет нарушить себя из-за уникального ограничения.

Однако, Update.AddToSetWrapped - правильный метод. Вы можете использовать findAndModify примерно так:

_db.FindAndModify<Post>(
   Query.And(
       Query.EQ("_id", post.Id), 
       Query.NE("Likes.userId", requestingUserId)), 
   Update.AddToSetWrapped("Likes", newLike));

Таким образом, он не найдет сообщение, если для данного идентификатора пользователя уже есть «лайк», и, следовательно, не будет вызывать обновление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...