我正在尝试将 MongoDB 记录解析为 pydantic 模型,但未能这样做 ObjectId
据我了解,我需要为 ObjectId 设置验证器,并尝试扩展 ObjectId 类并validator使用 ObjectId将装饰器添加到我的类中。我做了如下。
from pydantic import BaseModel, validator
from bson.objectid import ObjectId
class ObjectId(ObjectId):
pass
@classmethod
def __get_validators__(cls):
yield cls.validate
@classmethod
def validate(cls, v):
if not isinstance(v, ObjectId):
raise TypeError('ObjectId required')
return str(v)
class User(BaseModel):
who: ObjectId
class User1(BaseModel):
who: ObjectId
@validator('who')
def validate(cls, v):
if not isinstance(v, ObjectId):
raise TypeError('ObjectId required')
return str(v)
data = {"who":ObjectId('123456781234567812345678')}
Run Code Online (Sandbox Code Playgroud)
不幸的是,两个“解决方案”都失败了,如下所示:
>>> test = User(**data)
Traceback (most recent call last):
File "<stdin>", …Run Code Online (Sandbox Code Playgroud) 这个计划
class ObjectGarden
class << self.clone
puts self.object_id
end
end
puts ObjectGarden.clone.object_id
Run Code Online (Sandbox Code Playgroud)
在Linux上运行(已在RHEL上测试)object_id在多次运行中生成不同的s,如我所料.但是,当我在Windows上运行它时,我会在多次运行中获得相同的输出.而且不管我做什么(休眠/关机/"臭名昭着的蓝屏"并重启)object_ids都不会改变.
我还注意到,object_id如果我更改了程序的内容(甚至是一个无关紧要的更改,如添加新行或注释),那么在Windows上进行更改.
为什么Windows和Linux实现之间存在这种差异?由于我无法访问OS X,有人可以在Mac上运行它并记录结果.
我在Windows上使用Ruby 1.9.2-p136,在Linux上使用Ruby 1.9.2-p180.
我怎么能在这个架构中通过 id 找到图像。我有用户的 id 和我正在寻找的图像的 id。什么是最好的方法来做到这一点,并且在这种情况下所有图像都具有不同的 id,或者它们可能具有相同的 id,因为它们不属于同一个用户?
我的架构如下所示:
var userSchema = new Schema({
local: {
email: String,
password: String
},
facebook: {
id: String,
token: String,
email: String,
name: String
},
name: String,
about: String,
images: [{
id: Schema.ObjectId,
link: String,
main: Boolean
}]
});
Run Code Online (Sandbox Code Playgroud) 我昨天更新了我的流星并尝试使用新的Meteor.Collection.ObjectID.但由于没有成功.首先,我以这种方式更新了我的收藏:
myCollection = new Meteor.Collection('mycollection', {idGeneration: 'MONGO'}
现在,新的正常插入有_id样Wi2RmR6CSapkmmdfn......(?)
然后我有一个包含数组的集合.我喜欢为这个数组中的每个对象都有一个唯一的id.所以我$push是一个像id: new Meteor.Collection.ObjectID()我的数组一样的字段的对象.数据库中的结果如下:ObjectId("5b5fc278305d406cc6c33756").(这似乎很正常.)
但后来我想更新我推送的对象,如果id等于一个id,我之前将其作为数据属性存储在html标签中.
var equals = EJSON.equals(dbId, htmlId);(这导致每一次false,所以我记录的值dbId,并htmlId与控制台console.log(typeof dbId, dbId);)
这两个变量的值如下:
object { _str: 'a86ce44f9a46b99bca1be7a9' } (DBID)
string ObjectID("a86ce44f9a46b99bca1be7a9") (htmlId;这似乎是正确的,但为什么自定义类型是一个字符串?)
如何使用Meteor.Collection.ObjectID正确?
我的网址目前看起来像这样:
http://www.sitename.com/watch?companyId=507f1f77bcf86cd799439011&employeeId=507f191e810c19729de860ea&someOtherId=.....
Run Code Online (Sandbox Code Playgroud)
所以,正如你所看到的,它变得非常长,非常快.我在考虑缩短这些ObjectIds.想法是我应该为我的数据库中的每个模型添加名为"shortId"的新字段.所以不要:
var CompanySchema = mongoose.Schema({
/* _id will be added automatically by mongoose */
name: {type: String},
address: {type: String},
directorName: {type: String}
});
Run Code Online (Sandbox Code Playgroud)
我们会这样:
var CompanySchema = mongoose.Schema({
/* _id will be added automatically by mongoose */
shortId: {type: String}, /* WE SHOULD ADD THIS */
name: {type: String},
address: {type: String},
directorName: {type: String},
});
Run Code Online (Sandbox Code Playgroud)
我找到了这样做的方法:
// Encode
var b64 = new Buffer('47cc67093475061e3d95369d', 'hex')
.toString('base64')
.replace('+','-')
.replace('/','_')
;
// -> shortID is now: R8xnCTR1Bh49lTad
Run Code Online (Sandbox Code Playgroud)
但我仍然认为它可能更短.
另外,我发现这个npm模块: …
我有一个名为“人员”的集合(见下文),其中包含他们的个人详细信息和技能。我想从该集合中创建一个新集合(定期更新),其中包含填充了 ObjectID 的特定技能的出现总数。应使用正确的对象 ID 更新人员集合中的技能。
现在我有以下查询:
db.people.aggregate([
{ $unwind: "$expertise" },
{ $group : {
_id: "$expertise.item",
count: { $sum: 1 },
people: { $push: "$_id" }
}
}
])
Run Code Online (Sandbox Code Playgroud)
这给了我新的集合,但不幸的是我无法在该查询中生成唯一的 objectID。它一直告诉我需要一个累加器对象。
如何生成每个技能具有唯一 ObjectID 的技能数据库,并使用正确的技能 ObjectID更新人员集合?
人们
包含人物、他们的个人详细信息和他们的特定技能的集合。我已经删除了此示例的大部分数据。
{
"_id" : ObjectId("591c5d9be75d8a0d34f61786"),
"id" : 1,
"username" : "user@name.com",
"expertise" : [
{
"niveau" : 5,
"item" : "High Availability Systems"
},
{
"niveau" : 8,
"item" : "Object Oriented Design"
}
], …Run Code Online (Sandbox Code Playgroud) 我试图在现有游戏中插入一个回合,这给了我以下错误:
游戏验证失败:rounds.1.questions:Cast to Array 在路径“questions”处的值“[ 5ac5cfb41fca8a22f519cb22 ]”失败
架构的:
const roundSchema = Schema({
roundNumber: {
type: Number,
required: true,
},
categories: {
type: [String],
required: true
},
questions: {
type: [Schema.Types.ObjectID],
ref: 'Question',
required: true,
}
});
const gameSchema = Schema({
code: {
type: String,
required: true,
},
teams: {
type: [Schema.Types.ObjectID],
required: false,
},
rounds: [roundSchema]
});
const questionSchema = Schema({
question: {
type: String,
required: true,
},
answer: {
type: String,
required: true,
},
category: {
type: String,
required: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Mongo 数据库建立 hasMany 关系。我已按照环回 4 文档( https://loopback.io/doc/en/lb4/HasMany-relation.html )中的指南创建 hasMany 关系,并尝试设置不同的属性,但外键 custId 保存为字符串而不是 ObjectID。
我还从其他主题中找到了一些其他属性或选项,但人们正在使用 Loopback 3,但它似乎不适用于 Loopback 4。
我错过了什么或者有什么解决方法吗?
这是我的模型:
@model()
export class Order extends Entity {
@property({
type: 'string',
id: true,
generated: true,
})
id: string;
@property({
type: 'array',
itemType: 'string',
required: true,
})
product: string[];
@property({
type: 'number',
required: true,
})
price: number;
@property({
type: 'string',
id: true,
generated: true,
})
custId: string;
constructor(data?: Partial<Order>) {
super(data);
}
}
@model()
export class Customer extends Entity { …Run Code Online (Sandbox Code Playgroud) 使用 Joi 模式验证,是否可以针对 MongoDB ObjectID 进行验证?
像这样的事情可能很棒:
_id: Joi.ObjectId().required().error(errorParser),
Run Code Online (Sandbox Code Playgroud)