Сложный поиск в MongoDB - PullRequest
0 голосов
/ 21 мая 2018

Я определил PostSchema следующим образом.post записывается author и может быть прочитано многими людьми: lastOpens является массивом { time: ... , userId: ... }.

var PostSchema = new mongoose.Schema({
    title: { type: String }
    author: { type: mongoose.Schema.Types.ObjectId, ref: 'user' },
    lastOpens: { type: Array, default: [] }
})

Теперь я хочу написать статический метод, которыйвозвращает все сообщения, прочитанные одним пользователем:

PostSchema.statics.postsOpenedByUser = function (userId, cb) {
  // need to go through all the posts, and check their `lastOpens`. 
  // If `userId` is in `userId` of a `lastOpen`, then count the post in  
}

Мне известны такие методы, как find({ ... }) из MongoDB.Но я не знаю, как задать более сложный поиск, как мой.

Может ли кто-нибудь помочь?

Редактировать 1: Я пытался использовать оператор $where какследовательно, это не сработало:

PostSchema.statics.postsOpenedByUser = function (userId, cb) {
    return this.find({ $where: function () {
        var index = -1; 
        for (var i = 0; i < this.lastOpens.length; i++)
            if (this.lastOpens[i].userId === userId) { index = i; break }
        return !(index === -1)
}}, cb)

Есть ли что-то, что мы не могли сделать внутри $where?

1 Ответ

0 голосов
/ 21 мая 2018

Вы можете использовать Mongo для запроса массива встроенных документов .

В вашем случае это будет выглядеть примерно так:

PostSchema.statics.postsOpenedByUser = function (userId, cb) {
    return this.find( { "lastOpens.userId" : userId }, cb );
}

Это вернет все сообщения, которые имеют userId в lastOpens

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