我面对着一种猫鼬的奇怪行为。
让我们分析这个简单的愚蠢代码。
var mongoose = require('mongoose');
mongoose.connect('mongodb://127.0.0.1/sodatest', {
useMongoClient: true
});
var db = mongoose.connection;
var OriginalSchema = mongoose.Schema({
addedd: Date,
endPoint: Object,
inserted: Number,
total: Number
});
var OtherTestSchema = mongoose.Schema({
what: String,
modified_at: Date
});
var EndPointInTheDb = mongoose.model('aaa', OriginalSchema);
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function () {
console.log("we are connected!");
});
EndPointInTheDb.find({}, (err: String, exit: any) => {
console.log("Errore : " + err)
console.log(exit)
});
失败并返回
we are connected!
*********************
Error : null
[]
*********************
它失败了,因为收集" aaa"有15个元素。
如果我更改数据库" sodatest"与任何其他(除了另一个名称小写)和' aaa'使用另一个集合名称时,如果我使用正确的大小写,则无关紧,它会返回正确的结果。
we are connected!
*********************
Error : null
[ { _id: 59f76203592b426a16b8b32f,
modified_at: 2017-10-30T17:31:47.622Z,
last_position: 5,
what: 'CONTATOREGEOKEY',
__v: 0 } ]
*********************
(它也适用于多个元素)
我试图将数据库复制到另一个数据库中,
db.copyDatabase("sodatest","Prova14")
名称至少包含一个大写字符(Prova14),但同样没有结果。
如果我拼错了一个名字,我已经查了几个小时,但是我确实知道了。
如果我使用与集合真实模式不匹配的模式(" OtherTestSchema"),我也无法理解为什么它可以与任何其他数据库(其他14个具有异构模式)一起工作。 ......但不是最好的。
任何想法?
答案 0 :(得分:1)
如果没有提供,那么Mongoose会自动在集合名称的末尾添加一个“s”。例如:
// This will create a collection called 'aaas' since 'aaa' is passed as the
// model name
var EndPointInTheDb = mongoose.model('aaa', OriginalSchema);
// This is how you declare your collection name with a custom collection 'aaa'
var CorrectEndPointInTheDbToCollection = mongoose.model('aaa', OriginalSchema, 'aaa');
CorrectEndPointInTheDbToCollection.find({}, function(err, docs){
console.log(docs)
})
因此mongoose的初始化程序是mongoose.model('model name',Schema,'optional collection name')。强烈建议您传递集合名称,以便知道它指向正确的集合