Запрос Mongoose find () с populate () и параметром limit не возвращает ожидаемых результатов - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть модели колод и карт. Карты содержат ссылку «колода» для создания отношений. Я установил виртуальный массив под каждой колодой для извлечения всех соответствующих карт в виде массива.

Обычно все работает как положено, и я могу заполнить карты для своих колод.

ОДНАКО, если я введу опцию для заполнения, чтобы ограничить количество карточек, которые возвращаются в массиве, я получу неожиданные результаты. В частности, некоторые колоды возвращают карты, а некоторые нет.

Когда я передаю опцию 'sort' для заполнения, то по какой-то причине я начинаю получать карты для некоторых колод, но не для всех.

Мои определения схемы:

const mongoose = require('mongoose')

var CardSchema = new mongoose.Schema({
    question: {
      type: String,
      required: true
    },
    answer: {
      type: String,
      required: true
    },
    deck: {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Deck',
      required: true
    },
    created_at: {
        type: Date,
        default: Date.now(),
        index: true
    },
    active: {
        type: Boolean,
        required: false
    }
  })

var Card = mongoose.model('Card', CardSchema)

var DeckSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  description: {
    type: String,
    required: false
  },
  userId: {
    type: String,
    required: true 
  },
  username: {
    type: String
  },
  created_at: {
      type: Date,
      default: Date.now(),
      index: true
  },
  active: {
      type: Boolean,
      required: false
  }
},{
  toObject: {
    virtuals: true
  },
  toJSON: {
    virtuals: true
  }
})

DeckSchema.virtual('cards', {
  ref: 'Card',
  localField: '_id',
  foreignField: 'deck'
})

var Deck = mongoose.model('Deck', DeckSchema)

module.exports = {
    Deck: Deck,
    Card: Card
}

Пример карты и колоды документов:

Карта:

{
    "_id": {
        "$oid": "5cb6561a17055781fa83a401"
    },
    "created_at": {
        "$date": "2019-04-16T22:24:26.934Z"
    },
    "question": "Brunei",
    "answer": "Bandar Seri Begawan",
    "deck": {
        "$oid": "5ca09a141365a500179dbdd9"
    },
    "__v": 0
}

Палуба:

{
    "_id": {
        "$oid": "5ca09a141365a500179dbdd9"
    },
    "created_at": {
        "$date": "2019-03-31T10:41:18.640Z"
    },
    "name": "Capitals of the World",
    "userId": "5c97d9147295f32991fd2606",
    "__v": 49
}

Мой код nodejs для получения колод с 3 картами:

router.get('/', checkIfTokenBelongsToUser ,(req, res) => {
    Deck.find({userId: req.params.userId})
        .populate({
            path: 'cards',
            select: 'card question',
            options: {
                sort: 'question',
                limit: 3,
            }
        })
        .exec((err, decks) => {
        if (err) {
            res.status(500).json({error: err})
        }
        else if(!decks.length) {
            console.log('No decks for this user')
            res.status(200).json(decks)
        }
        else {
            console.log('Fetched decks')
            console.log(decks.length)
            res.status(200).json(decks)
        }
    })
})

Вывод отладки Mongodb:

Mongoose: decks.find({ userId: '5c97d9147295f32991fd2606' }, { projection: {} })
Mongoose: cards.find({ deck: { '$in': [ ObjectId("5cb65771ca969f83411413ec"), ObjectId("5cb65f75b8237f06922308e8"), ObjectId("5cbc8cee8d5f8113e9fea60e"), ObjectId("5cbcd1fc672a8e22e486808b"), ObjectId("5cbcd229e638eb23101c5711"), ObjectId("5cbcd24284841423430719df"), ObjectId("5cbcdaae69adad2cf25a9f37"), ObjectId("5cbcdc25ee67b62ede0e5d08"), ObjectId("5cbce1402e8d1634d49df744"), ObjectId("5cbce1b308d0483574fee3b0"), ObjectId("5cbce1db8315c935b351dcb9"), ObjectId("5cbce1f96054e735e34ca461"), ObjectId("5cbce22944ba9136059f3fcc"), ObjectId("5ca09a141365a500179dbdd9"), ObjectId("5ca9c095fb968c0017c5d531"), ObjectId("5c9f8ba7d2e7d20017595dc3") ] } }, { sort: { question: 1 }, limit: 48, projection: { card: 1, question: 1, deck: 1 } })

JSON-ответ:

[
    {
        "created_at": "2019-04-16T22:29:38.658Z",
        "_id": "5cb65771ca969f83411413ec",
        "name": "Countries by Continent",
        "userId": "5c97d9147295f32991fd2606",
        "__v": 0,
        "cards": [],
        "id": "5cb65771ca969f83411413ec"
    },
    {
        "created_at": "2019-04-16T23:04:19.542Z",
        "_id": "5cb65f75b8237f06922308e8",
        "name": "Jeopardy",
        "userId": "5c97d9147295f32991fd2606",
        "__v": 0,
        "cards": [
            {
                "_id": "5cb65f8de9cab80718476e8c",
                "question": "'\"'...Why look'st thou so?'--'With my crossbow I shot the albatross'\"'",
                "deck": "5cb65f75b8237f06922308e8"
            },
            {
                "_id": "5cb65f8de9cab80718476e80",
                "question": "'\"'Do all lawyers defend n-negroes, Atticus?'  'Of course they do, Scout'\"'",
                "deck": "5cb65f75b8237f06922308e8"
            },
            {
                "_id": "5cb65f8de9cab80718476eb5",
                "question": "'\"American Idiot\",<br />\"Dookie\"'",
                "deck": "5cb65f75b8237f06922308e8"
            }
        ],
        "id": "5cb65f75b8237f06922308e8"
    }
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...