我不完全理解MongoDB关系的工作方式,但我相信艺术家的关系专辑是艺术家(我称之为用户)有一个相册ID列表数组,可能称为albums: []
,所有相册都有createdBy: {id: 12345}
。
所以我想创建一个updateAlbum调用,但我不知道如何从GraphQL将ID保存到createdBy:
。
这是架构:
var AlbumSchema = new Schema({
name: String,
dateCreated: { type: Date, default: Date.now },
dateUpdated: { type: Date, default: Date.now },
users: [{ type: Schema.Types.ObjectId, ref: 'User' }],
createdBy: { type: Schema.Types.ObjectId, ref: 'User'}
});
var UserSchema = new Schema({
fName: String,
lName: String,
albums: [{ type: Schema.Types.ObjectId, ref: 'Album'}]
});
以下是GraphQL类型:
const UserType = new GraphQLObjectType({
name: 'User',
fields: () => ({
id: {type: GraphQLID},
fName: {type: GraphQLString},
lName: {type: GraphQLString},
albums: {type: new GraphQLList(AlbumType)}
})
})
const AlbumType = new GraphQLObjectType({
name: 'Album',
fields: () => ({
id: {type:GraphQLID},
name: {type:GraphQLString},
dateCreated: {type: GraphQLString},
dateUpdated: {type: GraphQLString},
users: {type: new GraphQLList(UserType)},
createdBy: {type: UserType}
})
})
这是updateAlbum调用:
updateAlbum: {
type: AlbumType,
args: {
id: {type: new GraphQLNonNull(GraphQLString)},
name: {type: GraphQLString},
createdById: {type: GraphQLString}
},
resolve(parentValue, args){
return new Promise((resolve, reject) => {
console.log(args.createdById)
const date = Date().toString()
ALBUM.findOneAndUpdate(
{"_id": args.id},
{ "$set":{name: args.name,
dateUpdated: date,
createdBy: args.createdById}},
{"new": true} //returns new document
).exec((err, res) => {
if(err) reject(err)
else resolve(res)
})
})
}
}
如何在updateAlbum函数中保存关系?
这是我得到的 - 如果我保存createdBy: THE_ID_STRING
它没有正确地执行它,当我查询时,我得到一个奇怪的未知字符串“Zj \b \u001e ( “ID字符串console.log()
为”5a6ac1afac97c908dc1edf28“
答案 0 :(得分:1)
根据您的Mongo Schema定义,我会说您对引用的理解是正确的,看看您使用Schema.Types.ObjectId
正确使用文档引用的方式。
现在,您只需将GraphQLID
映射为createdBy
的GraphQL 类型。
我喜欢使用别名,因为MongoId
有两个原因。
1)所以我明确地只知道GraphQL类型定义,如果我忘记了我分配给它的数据类型,那么无需回到Mongo Schema会发生什么行为:{{ 1}} || Schema.Types.ObjectId
。
2)最重要的是,要在视觉上强调标准String
类型与String
类型之间的重要区别,因为Mongo使用Object
作为文档索引Object.prototype
即使他们看起来像是来自_id
。
如:
String.prototype
顺便说一句,您应该验证import {
GraphQLList,
GraphQLID as MongoId,
GraphQLString as StringType,
GraphQLObjectType as ObjectType,
} from 'graphql';
const AlbumType = new ObjectType({
name: 'Album',
fields: () => ({
id: { type: MongoId },
name: { type: StringType },
dateCreated: { type: StringType },
dateUpdated: {type: StringType },
users: { type: new GraphQLList(UserType)},
createdBy: { type: MongoId}
})
})
不应该是id
。
如果您需要进一步说明,可以参考我刚刚完成的涉及此问题的项目。 GraphQL类型为here。