MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Проста реализация на маркиране с MongoDB

Тази статия е част от поредица:• Просто внедряване на маркиране с Elasticsearch
• Проста реализация на маркиране с JPA
• Разширено внедряване на маркиране с JPA
• Просто внедряване на маркиране с MongoDB (текуща статия)

1. Прегледа

В този урок ще разгледаме проста реализация на маркиране с помощта на Java и MongoDB.

За тези, които не са запознати с концепцията, тагът е ключова дума, използвана като „етикет“ за групиране на документи в различни категории. Това позволява на потребителите бързо да навигират в подобно съдържание и е особено полезно при работа с голямо количество данни.

Като се има предвид това, не е изненадващо, че тази техника се използва много често в блоговете. В този сценарий всяка публикация има един или повече тагове според обхванатите теми. Когато потребителят приключи с четенето, той може да последва един от маркерите, за да види още съдържание, свързано с тази тема.

Нека видим как можем да приложим този сценарий.

2. Зависимоста

За да направим заявка към базата данни, ще трябва да включим зависимостта на драйвера MongoDB в нашия pom.xml :

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.6.3</version>
</dependency>

Текущата версия на тази зависимост може да бъде намерена тук.

3. Модел на даннита

Първо, нека започнем, като планираме как трябва да изглежда един пощенски документ.

За да бъде опростено, нашият модел на данни ще има само заглавие, което също ще използваме като идентификатор на документа, автор и някои тагове.

Ще съхраняваме етикетите в масив, тъй като публикацията вероятно ще има повече от един:

{
    "_id" : "Java 8 and MongoDB",
    "author" : "Donato Rimenti",
    "tags" : ["Java", "MongoDB", "Java 8", "Stream API"]
}

Ще създадем и съответния клас модел на Java:

public class Post {
    private String title;
    private String author;
    private List<String> tags;

    // getters and setters
}

4. Актуализиране на етикети

След като настроихме базата данни и вмъкнахме няколко примерни публикации, нека видим как можем да ги актуализираме.

Нашият клас хранилище ще включва два метода за обработка на добавянето и премахването на тагове като използвате заглавието, за да ги намерите. Ще върнем също булева стойност, за да посочим дали заявката е актуализирала елемент или не:

public boolean addTags(String title, List<String> tags) {
    UpdateResult result = collection.updateOne(
      new BasicDBObject(DBCollection.ID_FIELD_NAME, title), 
      Updates.addEachToSet(TAGS_FIELD, tags));
    return result.getModifiedCount() == 1;
}

public boolean removeTags(String title, List<String> tags) {
    UpdateResult result = collection.updateOne(
      new BasicDBObject(DBCollection.ID_FIELD_NAME, title), 
      Updates.pullAll(TAGS_FIELD, tags));
    return result.getModifiedCount() == 1;
}

Използвахме addEachToSet метод вместо push за добавянето, така че ако маркерите вече са там, няма да ги добавяме отново.

Забележете също, че addToSet Операторът също няма да работи, тъй като ще добави новите тагове като вложен масив, което не е това, което искаме.

Друг начин, по който можем да извършваме нашите актуализации, е чрез обвивката на Mongo. Например, нека актуализираме публикацията JUnit5 с Java. По-специално, ние искаме да добавим таговете Java и JUnit5 и премахнете етикетите Пролет и ПОЧИВКА :

db.posts.updateOne(
    { _id : "JUnit 5 with Java" }, 
    { $addToSet : 
        { "tags" : 
            { $each : ["Java", "JUnit5"] }
        }
});

db.posts.updateOne(
    {_id : "JUnit 5 with Java" },
    { $pull : 
        { "tags" : { $in : ["Spring", "REST"] }
    }
});

5. Запитванияте

Не на последно място, нека да преминем през някои от най-често срещаните заявки, които може да ни интересуват, докато работим с тагове. За тази цел ще се възползваме по-специално от три оператора на масив:

  • $in – връща документите, където полето съдържа произволна стойност от посочения масив
  • $nin – връща документите, в които полето не съдържа стойност от посочения масив
  • $all – връща документите, където полето съдържа всички стойности от посочения масив

Ще дефинираме три метода за запитване на публикациите във връзка с колекция от тагове, предадени като аргументи . Те ще върнат публикациите, които съответстват на поне един маркер, всички тагове и нито един от етикетите. Също така ще създадем метод за съпоставяне за обработка на преобразуването между документ и нашия модел, използвайки Stream API на Java 8:

public List<Post> postsWithAtLeastOneTag(String... tags) {
    FindIterable<Document> results = collection
      .find(Filters.in(TAGS_FIELD, tags));
    return StreamSupport.stream(results.spliterator(), false)
      .map(TagRepository::documentToPost)
      .collect(Collectors.toList());
}

public List<Post> postsWithAllTags(String... tags) {
    FindIterable<Document> results = collection
      .find(Filters.all(TAGS_FIELD, tags));
    return StreamSupport.stream(results.spliterator(), false)
      .map(TagRepository::documentToPost)
      .collect(Collectors.toList());
}

public List<Post> postsWithoutTags(String... tags) {
    FindIterable<Document> results = collection
      .find(Filters.nin(TAGS_FIELD, tags));
    return StreamSupport.stream(results.spliterator(), false)
      .map(TagRepository::documentToPost)
      .collect(Collectors.toList());
}

private static Post documentToPost(Document document) {
    Post post = new Post();
    post.setTitle(document.getString(DBCollection.ID_FIELD_NAME));
    post.setAuthor(document.getString("author"));
    post.setTags((List<String>) document.get(TAGS_FIELD));
    return post;
}

Отново, нека да разгледаме и еквивалентните на обвивката заявки . Ще извлечем три различни колекции от публикации, съответно маркирани с MongoDB или Поток API, маркиран с двете Java 8 и JUnit 5 и не са маркирани с Groovy нито Scala :

db.posts.find({
    "tags" : { $in : ["MongoDB", "Stream API" ] } 
});

db.posts.find({
    "tags" : { $all : ["Java 8", "JUnit 5" ] } 
});

db.posts.find({
    "tags" : { $nin : ["Groovy", "Scala" ] } 
});

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. най-добрата практика на обединяването на django + PyMongo?

  2. Как да съхранявам резултати от динамично генерирани формуляри в MongoDb?

  3. Стъпки за инсталиране на MongoDB на Amazon Linux

  4. Как да защитя полето за парола в Mongoose/MongoDB, така че да не се върне в заявка, когато попълвам колекции?

  5. Как да премахнете елемента на масива в mongodb?