我有一个launchIds
的ID数组。
我正在尝试将其推入模型字段trips
$addToSet: { trips: { $each: launchIds }
。这给我一个错误:Cast to [ObjectId] failed for value \"[\"1\",\"2\",\"3\"]\...
如果我尝试通过launchIds
映射并转换为Mongoose.Shema.Types.ObjectId
,则进入数据库trips: [null,null,null]
lauchIds = ['1','2','3']
async bookTrips({ launchIds }) {
let userId = "5bf7f7b3817119363da48403";
const mongoIds = launchIds.map(l => Mongoose.Schema.Types.ObjectId(l));
return this.store.User.findByIdAndUpdate(
{ _id: userId },
{
$addToSet: { trips: { $each: mongoIds } }
},
{ new: true }
);
}
这是我的模型架构:
const UserSchema = new Mongoose.Schema(
{
email: {
type: String,
required: true
},
token: String,
trips: [
{
type: Mongoose.Schema.Types.ObjectId,
ref: "trip"
}
]
},
{ timestamps: true }
);
我正在通过grapql游乐场传递ID。这是我的mutation
:
bookTrips: async (_, { launchIds }, { dataSources }) => {
console.log(launchIds);
// logs ['1','2','3']
console.log(typeof launchIds);
//Object
const results = await dataSources.userAPI.bookTrips({ launchIds });
console.log(results);
return { message: "hello" };
}
答案 0 :(得分:0)
要将字符串或数字转换为mongo对象,请使用Mongoose.Types.ObjectId
,
const mongoIds = launchIds.map(l => Mongoose.Types.ObjectId(l));
答案 1 :(得分:0)
我找回了一个应该是数字的字符串数组
解决方案:
我的模型(与上面相同):
const UserSchema = new Mongoose.Schema(
{
email: {
type: String,
required: true
},
token: String,
trips: [
{
type: Mongoose.Schema.Types.ObjectId,
ref: "trip"
}
]
},
{ timestamps: true }
);
原始API:
async bookTrips({ launchIds }) {
let userId = "5bf7f7b3817119363da48403";
const idsToNums = launchIds.map(Number);
const mongoIds = idsToNums.map(l => Mongoose.Types.ObjectId(l));
return this.store.User.findByIdAndUpdate(
{ _id: userId },
{
$push: { trips: { $each: mongoIds } }
},
{ new: true }
);
}
请注意模型上的Mongoose.Schema.Types.ObjectId
和api上的Mongoose.Types.ObjectId
。如果我从模型中删除Schema
或将Schema
添加到api,则会收到错误消息。不知道为什么,但是上面的示例有效。我希望有人会对此有所帮助或提出更好的解决方案。