iT邦幫忙

0

關於 MongoDB 的collection name 問題

  • 分享至 

  • xImage

各位前輩好,目前正在學習 MongoDB 遇到一個問題卡住,希望能得到解答:

我在 mocha 的 beforeEach hook 裡寫了這段 code

beforeEach((done) => {
     mongoose.connection.collections.mariochars.drop(() => done() )
})

然後這邊是我的 model

const MarioChar = mongoose.model('marioChar', MarioCharSchema)

我的問題是:
1.在第一個 hook 裡面的 mariochars 跟 model 的 marioChar 是一樣的嗎,因為上網查了一下發現他們都是集合名稱,但兩個名字不一樣依然能 run 出想要的效果

2.如果是的話,為什麼我把 hook 裡面的 mariochars 改成 marioChars 程式就會跳錯呢?

以上兩個問題,還盼請請坐不吝解答,謝謝!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
benny123tw
iT邦新手 5 級 ‧ 2021-10-07 10:20:31

假設你沒有提供collection的話,他會將你提供的model name轉換成複數變成collection。

如果你有呼叫mongoose.connection.collections看看的話,你就會看到他是一個obj,然後以轉換成複數的name作為key,因此你的key不對js一定會報錯。

你可以參考看看mogoose的原始碼:

  1. Mongoose.prototype._model
  if (!collection) {
    collection = schema.get('collection') ||
      utils.toCollectionName(name, _mongoose.pluralize());
  }
  1. exports.toCollectionName
exports.toCollectionName = function(name, pluralize) {
  if (name === 'system.profile') {
    return name;
  }
  if (name === 'system.indexes') {
    return name;
  }
  if (typeof pluralize === 'function') {
    return pluralize(name);
  }
  return name;
};
  1. pluralize.js 這個js就是主要換成複數型態的function,可以點進去看他具體怎麼操作的。
function pluralize(str) {
  let found;
  str = str.toLowerCase();
  if (!~uncountables.indexOf(str)) {
    found = rules.filter(function(rule) {
      return str.match(rule[0]);
    });
    if (found[0]) {
      return str.replace(found[0][0], found[0][1]);
    }
  }
  return str;
}

希望有回答到你的問題^_^

我要發表回答

立即登入回答