Как мне указать файл конфигурации с sbt 0.12.2 для теста sbt?

Независимо от того, как вы структурируете свой общий документ, в основном вам нужны две вещи. Это, по сути, свойство четыре «счет» и «список» тех, кто уже разместил там «как», чтобы гарантировать, что дубликатов нет. Вот базовая структура:

{ 
    "_id": ObjectId("54bb201aa3a0f26f885be2a3")
    "photo": "imagename.png",
    "likeCount": 0
    "likes": []
}

В любом случае существует уникальная «_id» для вашей «фотопостановки» и любой информации, которую вы хотите, но затем других полей, как упоминалось. Свойством «любит» здесь является массив, и он будет удерживать уникальные значения «_id» от «пользовательских» объектов в вашей системе. Таким образом, каждый «пользователь» имеет свой собственный уникальный идентификатор где-то, либо в локальном хранилище, либо в OpenId или что-то в этом роде, но в уникальном идентификаторе. Я буду придерживаться ObjectId для примера.

Когда кто-то отправляет сообщение «как» в сообщение, вы хотите выпустить следующий оператор обновления:

db.photos.update(
    { 
        "_id": ObjectId("54bb201aa3a0f26f885be2a3"), 
        "likes": { "$ne": ObjectId("54bb2244a3a0f26f885be2a4") }
    },
    {
        "$inc": { "likeCount": 1 },
        "$push": { "likes": ObjectId("54bb2244a3a0f26f885be2a4") }
    }
)

Теперь операция $inc увеличит значение «likeCount» на указанное число, поэтому увеличьте на 1. Операция $push добавляет уникальный идентификатор для пользователя к массиву в документе для справки в будущем.

Главное здесь - сохранить запись тех пользователей, которые голосовали и что происходит в части запроса. Помимо выбора документа для обновления по его собственному уникальному «_id», еще одна важная вещь - проверить, что «нравится» массив, чтобы убедиться, что текущий пользователь голосования там уже отсутствует.

То же самое true для обратного случая или «удаление» «like»:

db.photos.update(
    { 
        "_id": ObjectId("54bb201aa3a0f26f885be2a3"), 
        "likes": ObjectId("54bb2244a3a0f26f885be2a4")
    },
    {
        "$inc": { "likeCount": -1 },
        "$pull": { "likes": ObjectId("54bb2244a3a0f26f885be2a4") }
    }
)

. Главное здесь - условия запроса, используемые для обеспечения того, чтобы ни один документ не касался, если все условия не выполняются. Таким образом, подсчет не увеличивается, если пользователь уже голосовал или уменьшался, если их голос фактически не присутствовал на момент обновления.

Конечно, нецелесообразно читать массив с несколькими сто записей в документе в любой другой части вашего приложения. Но MongoDB имеет очень стандартный способ справиться с этим:

db.photos.find(
    { 
        "_id": ObjectId("54bb201aa3a0f26f885be2a3"), 
    },
    { 
       "photo": 1
       "likeCount": 1,
       "likes": { 
          "$elemMatch": { "$eq": ObjectId("54bb2244a3a0f26f885be2a4") }
       }
    }
)

Это использование $elemMatch в проекции будет возвращать только текущего пользователя, если они присутствуют, или просто пустой массив, где они нет. Это позволяет остальной логике вашего приложения быть в курсе, если текущий пользователь уже поставил голосование или нет.

Это базовая техника и может работать для вас как есть, но вы должны знать, что встроенные массивы не должны быть бесконечно расширенными, а также на жестком ограничении 16 МБ для документов BSON. Таким образом, концепция звучит, но просто не может быть использована сама по себе, если вы ожидаете 1000 «похожих голосов» на свой контент. Существует концепция, известная как «bucketing», которая более подробно обсуждается в этом примере для схемы гибридной схемы , которая позволяет одному решению хранить большой объем «симпатий». Вы можете взглянуть на это, чтобы использовать вместе с основными понятиями здесь как способ сделать это на томе.

13
задан fpearsall 14 March 2013 в 12:02
поделиться