npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

mongoose-document-slugs

v1.1.1

Published

A mongoose plugin that generates slugs and manages slug aliasing

Downloads

21

Readme

CircleCI Coverage Status bitHound Overall Score bitHound Dependencies bitHound Dev Dependencies bitHound Code

Mongoose Document Slugs

Mongoose document slugs is a plugin for the Mongoose ORM. This plugin will generate slugs from a given field automatically upon document creation. When the document slug is modified, the previous slug value will be retained as an alias. This means that if the document is searched for via it's previous slug it can still be found. Note that if another document's slug is set to the value of an existing alias, the alias is removed, and the document takes ownership of the slug.

Setup

First things first you need to add the plugin to your schema.

const mongoose      = require('mongoose');
const Schema        = mongoose.Schema;
const mongooseSlugs = require('mongoose-slugs');

const postSchema = new Schema({
  title: { type: String },
  body : { type: String }
});
postSchema.plugin(mongooseSlugs, { sourceField: 'title' });

mongoose.model('Post', postSchema);

In the example above we create a postSchema then register it as a model. Typically blogs have slugs for each post, allowing the software to have pretty urls that humans can remember and recognize. By adding Mongoose Slugs as a plugin for the postSchema, and telling it to use the title field is our sourceField, Mongoose Slugs will automatically generate a slug for new post documents from the title automatically.

const Post = mongoose.model('Post');


const post = new Post({ title: 'My day at the beach :)', body: '...' });

post.save(() => {
  post.slug === 'my-day-at-the-beach'
});

Slug collisions

Mongoose Document Slugs will prevent slug collisions by suffixing slugs with a dash and a number. This works by performing a count on the collection the and finding a single document with matching slug. If found a findOne is preformed using a regex matching the slug with a suffix present. The sort order is set so the document with the largest suffix is returned. If no result is found then '-1' is added to the end of the slug. Otherwise the tool will add 1 to the suffix number and append it to the slug.

const Post = mongoose.model('Post');


const post = new Post({ title: 'My day at the beach :)', body: '...' });

// my-day-at-the-beach-1, my-day-at-the-beach-2, and my-day-at-the-beach-3
// already exist.
post.save(() => {
  post.slug === 'my-day-at-the-beach-4'
});