Как запросить карту вложенных документов по ключу в MongoDB? - PullRequest
0 голосов
/ 08 мая 2019

Я создал следующую схему mongoose для сохранения музыкальных данных, которые я извлекаю из iTunes API:

...
const MusicAlbumSchema = new Schema({
  artist_name: {
    type: String,
    required: 'enter an artist name'
  },
  album_name: {
    type: String,
    required: 'enter an album name'
  },
  artwork_url: {
    type: String,
    required: 'enter an artwork url'
  }
});
const SearchResultSchema = new Schema({
  created_date: {
    type: Date,
    default: Date.now
  },
  search: {
    type: Map,
    of: [ MusicAlbumSchema ]
  }
});
...

поле поиска в SearchResultSchema принимает поисковый запрос в качестве ключа (например, «The Beatles»).') и сохраняет возвращенные результаты в виде массива вложенных документов MusicAlbumSchema.Чтобы проверить это, я попытался написать несколько тестов мокко:

...
  it('Creates a search result with sub-documents', done => {
    const musicAlbum1 = new MusicAlbum({
      artist_name: 'The Beatles',
      album_name: 'Abbey Road',
      artwork_url: 'www.google.com'
    });
    const musicAlbum2 = new MusicAlbum({
      artist_name: 'The Beatles',
      album_name: 'Let It Be',
      artwork_url: 'www.google.com'
    });

    const result = new SearchResult({
      search: {}
    });
    result.search.set('The Beatles', [musicAlbum1, musicAlbum2]);


    result.save().then(() => {
      SearchResult.findOne({
        'The Beatles' : { $exists : true }
      }).then(records => {
        console.log(records);
        assert(records.length === 2);
        done();
      });
    });
  });
...

Что я делаю не так и как правильно запрашивать сохраненные данные (особенно - поле поиска в SearchResultSchema)?

1 Ответ

0 голосов
/ 08 мая 2019

Решил изменить мою схему на такую:

const MusicAlbumSchema = new Schema({
  artist_name: {
    type: String,
    required: true
  },
  album_name: {
    type: String,
    required: true
  },
  artwork_url: {
    type: String,
    required: true
  }
});

const SearchResultSchema = new Schema({
  created_date: {
    type: Date,
    default: Date.now
  },
  search_query: {
    type: String,
    required: true,
    unique: true,
    dropDups: true
  },
  search_results: [MusicAlbumSchema]
});

- и, следовательно, изменился и тест мокко:

  it('Creates a search result with sub-documents', done => {
    const musicAlbum1 = new MusicAlbum({
      artist_name: 'The Beatles',
      album_name: 'Abbey Road',
      artwork_url: 'www.google.com'
    });
    const musicAlbum2 = new MusicAlbum({
      artist_name: 'The Beatles',
      album_name: 'Let It Be',
      artwork_url: 'www.google.com'
    });

    const result = new SearchResult({
      search_query: 'The Beatles',
      search_results: [musicAlbum1, musicAlbum2]
    });

    result.save().then(() => {
      SearchResult.findOne({
        search_query: 'The Beatles'
      }).then(record => {
        assert(record.search_results.length === 2);
        done();
      });
    });
  });
...