gpt4 book ai didi

node.js - 如何通过 Mongoose 加载带有自定义 _id 的文档?

转载 作者:可可西里 更新时间:2023-11-01 09:23:17 24 4
gpt4 key购买 nike

这是我的架构定义:

var DocSchema = new mongoose.Schema({
_id: {
name: String,
path: String
},
label: String,
...
});
mongoose.model('Doc', DocSchema, 'doc_parse_utf8');
var Doc = mongoose.model('Doc');

并且文件已经被其他程序插入到mongodb中。然后我尝试查询文档:

Doc.findOne({_id:{name:name,path:path}}, function(err, doc){
if (err && err_handler) {
err_handler(err);
} else if(callback) {
callback(doc);
}
});

但是,会报一个转换错误:

{ message: 'Cast to ObjectId failed for value "[object Object]" at path "_id"',
name: 'CastError',
type: 'ObjectId',
value: { name: 'mobile', path: 'etc/' },
path: '_id' }

我已经在mongoose的文档、google和statckoverflow.com上搜索了这个问题,但是没有任何解决方案。请帮助,谢谢。

最佳答案

您只需将 _id 类型设置为 Mixed 即可。

var UserSchema = new Schema({
_id: Schema.Types.Mixed,
name: String
});

这会导致 Mongoose 基本上忽略对象的细节。

现在,当您使用 find 时,它会起作用(几乎符合预期)。

我警告你,你需要确定你正在使用的 _id 对象的属性顺序必须以完全相同的顺序提供,或者 _id 不会被认为是相同的。

例如,当我尝试这样做时:

var User = mongoose.model('User', UserSchema);

var testId = { name: 'wiredprairie', group: 'abc'};
var u = new User({_id: testId , name: 'aaron'});

u.save(function(err, results) {
User.find().where("_id", testId)
.exec(function(err, users) {
console.log(users.length);
});
});

控制台输出为 0

我注意到 MongoDB 中实际数据的存储方式与我想象的不同:

{ 
"_id" : {
"group" : "abc",
"name" : "wiredprairie"
},
"name" : "aaron",
"__v" : 0
}

如您所见,它不是 name 然后是 group 我编码的。 (它是按字母顺序排列的,回想起来是有道理的)。

所以,相反,我这样做了:

var User = mongoose.model('User', UserSchema);

var testId = { name: 'wiredprairie', group: 'abc'};
var u = new User({_id: testId , name: 'aaron'});

u.save(function(err, results) {
User.find().where("_id", { group: 'abc', name: 'wiredprairie'})
.exec(function(err, users) {
console.log(users.length);
});
});

然后,控制台输出为 1

关于node.js - 如何通过 Mongoose 加载带有自定义 _id 的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20895255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com