Запросы вложенных документов в mongoDB с помощью mongoose - PullRequest
0 голосов
/ 04 мая 2020

Я начинающий веб-разработчик с полным стеком. и я пытаюсь сделать рейтинг сайта mov ie. поэтому у меня есть пользовательская схема, использующая mon goose и вложенный документ оценок в схеме. Пример схемы:

const ratingSchema = new mongoose.Schema({
    name: String,
    url: String,
    rating: {
        type: Number,
        min: 0,
        max: 10
    },
    comment: String
})

const userSchema = new mongoose.Schema({
    email: String,
    username: String,
    password: String,
    ratings: [ratingSchema]
})

пример используемой схемы будет:

const newuser = new User({
email: 'test1@a.com',
username: 'maintest',
password: 'aaaa',
ratings: [{
name: 'Avengers'
url: 'www.avengers.com',
rating: 5,
comment: 'Good Movie'
}]

})

, учитывая приведенный выше пример: у меня есть страница, которая показывает все оценки пользователей каждого mov ie и у меня также есть панель поиска, где я хочу иметь возможность искать имя mov ie и видеть всплывающее окно с оценкой mov ie. По сути, мой вопрос заключается в том, как запросить в базе данных все рейтинги каждого пользователя и получить каждое имя mov ie из запроса. например: я опрашиваю всю базу данных и каждого пользователя .. потому что каждый пользователь может оценить одинаковое mov ie и дать ему то же имя .. и получить дБ пользователей, которые оценили mov ie 'Мстители'. Пожалуйста, если вам нужна дополнительная информация по этому вопросу, пожалуйста, не стесняйтесь спрашивать меня! Спасибо

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Согласно этой ссылке , не проверялось, но вы можете попробовать что-то подобное с mon goose:

User.find().elemMatch('ratings', { name: 'Avengers'})
0 голосов
/ 04 мая 2020

Один из способов сделать это sh То, что вам нужно, это сделать:

db.getCollection("movie-ratings").aggregate([
  { $unwind: "$ratings" },
])

Это сведет все ваши документы. Пример вывода:

{ "_id" : ObjectId("5eb059141d704dbea32156a9"), "email" : "test1@a.com", "username" : "maintest", "password" : "aaaa", "ratings" : { "name" : "Avengers", "url" : "www.avengers.com", "rating" : 5, "comment" : "Good Movie" } }
{ "_id" : ObjectId("5eb059141d704dbea32156a9"), "email" : "test1@a.com", "username" : "maintest", "password" : "aaaa", "ratings" : { "name" : "Hulk", "url" : "www.avengers.com", "rating" : 2, "comment" : "Good Movie" } }

Кроме того, поскольку вы находитесь внутри агрегата, вы можете применить к нему множество различных операторов агрегатов. Например, вы можете применить оператор сопоставления для фильтрации по заданному заголовку c:

db.getCollection("movie-ratings").aggregate([
  { $unwind: "$ratings" },
  { $match: { 'ratings.name': 'Avengers' } }
])

Подробнее о различных операторах можно прочитать здесь:

https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/

ОБНОВЛЕНИЕ: Используя mon goose, вы можете сделать что-то вроде этого. Предположим, у вас есть модель mon goose под названием Ratings, тогда вы можете сделать:

const aggregate = Ratings.aggregate([
  { $unwind: "$ratings" },
  { $match: { 'ratings.name': 'Avengers' } }
]);

Более подробную информацию о агрегатах с mon goose можно найти здесь:

https://mongoosejs.com/docs/api/aggregate.html#aggregate_Aggregate

Надеюсь, это поможет вам.

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