MongoDb Запрос на поле массива вложенного объекта - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь опросить всех пользователей, которые одобрили событие.Идентификатор события хранится в документе пользователя во вложенном объекте.

Моя схема выглядит следующим образом

{
    email: {
      type: String,
      unique: true,
      required: [true, 'Email is required!'],
      trim: true,
      validate: {
        validator(email) {
          const emailRegex = /^[-a-z0-9%S_+]+(\.[-a-z0-9%S_+]+)*@(?:[a-z0-9-]{1,63}\.){1,125}[a-z]{2,63}$/i;
          return emailRegex.test(email);
        },
        message: '{VALUE} is not a valid email!',
      },
    },
    role: {
      type: String,
      enum: ['admin', 'user', 'planner'],
      default: 'user',
    },
    name: {
      type: String,
      trim: true,
    },
    username: {
      type: String,
      trim: true,
      unique: true,
    },
    password: {
      type: String,
      required: [true, 'Password is required!'],
      trim: true,
      minlength: [6, 'Password needs to be longer!'],
      validate: {
        validator(password) {
          return password.length >= 6 && password.match(/\d+/g);
        },
      },
    },
    picture: {type: String},
    favorites: {
      events: [
        {
          type: Schema.Types.ObjectId,
          ref: 'Event',
        },
      ],
    },
  }

Как мне написать этот запрос?

У меня естьпробовал все виды комбинаций с $elemMatch и обычные запросы, а также

1 Ответ

0 голосов
/ 17 декабря 2018

$elemMatch следует использовать как объект, но в массиве favorites.events каждый элемент является String (ObjectID), поэтому вы должны использовать $eq, чтобы сопоставить каждый элемент со String, который является идентификатором нужного вам события.

Решение:

User.find({
    'favorites.events': {
        '$elemMatch': {
            '$eq': id
        }
    }
})

Документ для $elemMatch здесь https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#element-match

И документ для $eq здесь https://docs.mongodb.com/manual/reference/operator/query/eq/

Вы должнывопрос с простой структурой монго.Пример, это мой тест для вашей проблемы

const Schema = mongoose.Schema;

const EventSchema = new Schema({
    title: String
})

const UserSchema = new Schema({
    username: String,
    favorites: {
        events: [{
            type: Schema.Types.ObjectId,
            ref: 'Event',
        }]
    }
});

const User = mongoose.model('User', UserSchema);
const Event = mongoose.model('Event', EventSchema)

app.get('/users/event/:id', (req, res) => {
    const {id} = req.params;
    console.log(id);
    User.find({
        'favorites.events': {
            '$elemMatch': {
                '$eq': id
            }
        }
    }).then(u => res.send(u)) })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...