ทำไมพังพอนจึงใส่ s ต่อท้ายชื่อคอลเลคชันของฉันเสมอ


120

ตัวอย่างเช่นรหัสนี้ส่งผลให้มีการสร้างคอลเล็กชันที่เรียกว่า "ข้อมูล"

var Dataset = mongoose.model('data', dataSchema);

และรหัสนี้ส่งผลให้มีการสร้างคอลเล็กชันที่เรียกว่า "ผู้ใช้"

var User = mongoose.model('user', dataSchema);

ขอบคุณ


3
มันเป็นการประชุมใน Rails คุณมีวัตถุ "ผู้ใช้" คุณเก็บไว้ในคอลเล็กชัน "ผู้ใช้" ฉันเดาว่าพังพอนเหมือนกัน
Sergio Tulentsev

ใช่ชุดข้อมูลที่น่าสนใจพอสมควร = mongoose.model ('datas', dataSchema); ผลลัพธ์ในคอลเล็กชันที่เรียกว่า datas
Bob Ren

ดูเหมือนว่าตรรกะแบบพหูพจน์ไม่ใช่เรื่องโง่ (หรือฉลาดขึ้นอยู่กับสิ่งที่คุณคาดหวัง) ฉันแน่ใจว่าคุณจะพบว่ามันทำงานอย่างไร (หาแหล่งที่มา)
Sergio Tulentsev

2
@SergioTulentsev นั่นไม่ใช่ทับทิม แต่ทำงานในลักษณะเดียวกับgithub.com/LearnBoost/mongoose/blob/master/lib/utils.js

7
สำหรับบันทึก ข้อมูลเป็นพหูพจน์เอกพจน์ของข้อมูลคือข้อมูล
Luis Sieira

คำตอบ:


199

พังพอนพยายามทำตัวให้ฉลาดโดยตั้งชื่อคอลเลคชันของคุณให้เป็นพหูพจน์ อย่างไรก็ตามคุณสามารถบังคับให้เป็นอะไรก็ได้ที่คุณต้องการ:

var dataSchema = new Schema({..}, { collection: 'data' })


31
ฉันไม่เข้าใจว่าการเพิ่ม "s" ทำให้กรอบงานฉลาดขึ้น IMHO เป็นความคิดที่ไม่ดีได้อย่างไร นอกเหนือจากพังพอนนั้นยังเป็นกรอบที่ยอดเยี่ยม
Roberto

14
เป็นทางเลือกที่ไม่ดีแบบเก่าที่ทำลายความเข้ากันได้แบบย้อนกลับหากนำออก เราจึงเลือกที่จะยึดติดกับมัน
aaronheckmann

18
มันไม่เพียงแค่เพิ่ม 's' แต่ยังสร้างพหูพจน์ที่ถูกต้องของชื่อ ลองใช้อินสแตนซ์ด้วย "เมาส์" คุณจะได้รับคอลเล็กชันชื่อ "หนู" หรือ "คน" คุณจะได้รับ "คน" มันทำให้ฉัน
แทบ

3
นี่มันบ้ามากตอนนี้คุณใช้ชื่อใดในการสืบค้นคอลเลกชันของคุณโดยเฉพาะเมื่อคุณต้องทำจากอินเทอร์เฟซอื่น?
Xsmael

8
ฉันรู้สึกแปลก ๆ เพราะฉันกำหนด "แปรง" และมีคอลเลคชันชื่อ "แปรง" ฉันพยายามหาที่ที่ฉันกำหนดไว้เกือบครึ่งชั่วโมงแล้วก็ไม่พบอะไรเลย ฉันคิดว่า: "อาจจะฉลาดและเพิ่มสิ่งนั้นอาจจะไม่ แต่เอาเถอะ .... FUUUUUUU"
Fusseldieb

49

โครงสร้าง API ของพังพอนโมเดลคือ:

Mongoose#model(name, [schema], [collection], [skipInit])

สิ่งที่พังพอนทำก็คือเมื่อไม่มีการส่งผ่านอาร์กิวเมนต์คอลเลกชันพังพอนจะสร้างชื่อคอลเลกชันโดยการทำให้ชื่อรุ่นเป็นพหูพจน์ หากคุณไม่ชอบพฤติกรรมนี้ให้ส่งชื่อคอลเลกชันหรือตั้งค่าตัวเลือกชื่อคอลเล็กชันสกีมาของคุณ

ตัวอย่าง:

var schema = new Schema({ name: String }, { collection: 'actor' });

หรือ

schema.set('collection', 'actor');

หรือ

var collectionName = 'actor'
var M = mongoose.model('Actor', schema, collectionName);

30

เริ่มจากพังพอน 5.x คุณสามารถปิดใช้งานได้อย่างสมบูรณ์:

mongoose.pluralize(null);

ทางออกที่ดีที่สุดเนื่องจากเราไม่จำเป็นต้องกำหนดทั้งชื่อรุ่นและชื่อคอลเลคชัน
Nezih

นี่เป็นแนวทางที่ดีที่สุดแน่นอน
netishix

1
ฉันใช้เวลาหลายชั่วโมงในการเรียนรู้เกี่ยวกับความฉลาดแบบนี้ของพังพอน อย่างไรก็ตาม - ดีใจที่พบวิธีแก้ปัญหานี้ BTW: นอกจากนี้ยังหลีกเลี่ยงการใส่ชื่อคอลเลกชันที่ต่ำลงโดยอัตโนมัติ
Bernhard Fürst

8

คุณสามารถเพิ่มสตริงเป็นอาร์กิวเมนต์ที่สามเพื่อกำหนดชื่อจริงสำหรับคอลเลกชัน ขยายตัวอย่างของคุณเพื่อให้ชื่อเป็นdataและuserตามลำดับ:

var Dataset = mongoose.model('data', dataSchema, 'data');

var User = mongoose.model('user', dataSchema, 'user');

2

คุณสามารถเพิ่มชื่อคอลเล็กชันเป็นพารามิเตอร์ที่สาม ดูตัวอย่างโดยใช้ typescript:

import DataAccess = require('../DataAccess');
import IUser = require("../../Models/Interfaces/IUser");

var mongoose = DataAccess.mongooseInstance;
var mongooseConnection = DataAccess.mongooseConnection;

class UserSchema {
        static get schema () {
        var schema =  mongoose.Schema({
            _id : {
                type: String
            },
            Name: {
                type: String,
                required: true
            },
            Age: {
                type: Number,
                required: true
            }
        });

        return schema;
    }
}
var schema:any = mongooseConnection.model<IUser>("User", 
UserSchema.schema,"User");
export = schema;

2
//Mongoose's definition file. NOT your model files
1 const mongoose = require("mongoose");
2 mongoose.pluralize(null);

การเพิ่มบรรทัดmongoose.pluralize(null)ในไฟล์ Mongoose ของคุณจะป้องกันไม่ให้ชื่อคอลเล็กชันเป็นพหูพจน์ คุณไม่จำเป็นต้องเพิ่มบรรทัดนี้ในไฟล์โมเดลของคุณ

ดังที่เห็นนี้ .


1

ในตอนท้ายของการกำหนดสคีมาของคุณในบรรทัดถัดไปใช้รหัสนี้

module.exports = mongoose.model("State", "StateSchema", "state")

สมมติว่าสถานะของคุณคือสิ่งที่คุณต้องการใช้บนฐานข้อมูลของคุณเพื่อหลีกเลี่ยง s เป็นสถานะ

คลิกลิงค์เพื่อดูภาพอย่างถูกต้อง


-2

Mongoose รวบรวมแบบจำลองสำหรับคุณเมื่อคุณเรียกใช้คำสั่งนี้

var schema = new mongoose.Schema({ name: 'string', size: 'string' });
var child = mongoose.model('child', schema);

อาร์กิวเมนต์แรกคือชื่อเอกพจน์ของคอลเล็กชันแบบจำลองของคุณ พังพอนลักษณะโดยอัตโนมัติสำหรับพหูพจน์lowercasedรุ่นของชื่อรุ่นของท่าน ดังนั้นตัวอย่างข้างต้น model child จึงมีไว้สำหรับคอลเลกชันเด็กในฐานข้อมูล

หมายเหตุ:.model()ฟังก์ชั่นทำสำเนาของสคีมา ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มทุกสิ่งที่คุณต้องการลงในสคีมารวมถึงตะขอก่อนโทร.model()!


คุณกำลังสร้างปัญหาขึ้นมาใหม่?
Pedro JR
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.