【问题标题】:Mongoose insertMany with a possible lookup on a populateMongoose insertMany 可能在填充上查找
【发布时间】:2017-10-06 01:19:59
【问题描述】:

我有一个 MEAN 应用程序,我允许用户上传包含多个事件行的 CSV。在称赞 CSV 之后,我有一个 Event 对象列表,我可以使用 mongoose insertMany 插入记录。我有一个这样的活动和参加者模式(针对这个问题进行了简化)。

var EventSchema = new mongoose.Schema({
    name: String,
    date: Date,
    location: String,
    speaker: { type: ObjectId, ref: 'Attendee' },
});

var AttendeeSchema = new mongoose.Schema({
    firstname: String,
    email: {type: String, unique : true},
    speaker: Boolean,
});

我的问题是当用户上传 CSV 时,他们只会知道演讲者的电子邮件地址,而不知道 ObjectId。此电子邮件将始终是唯一的。在执行 Event.insertMany() 时,有一种方法可以在电子邮件上执行 Attendee.findOne,并在插入每个事件时使用 ObjectId 引用填充扬声器字段。

【问题讨论】:

  • 你好。为什么不按顺序做,先准备 Attendee 对象,再做 Event.insertMany()?
  • 我不是 mongoose(mongo) 的专家,这不是直接的答案,但您可以通过首先查询 AttendeeSchema 以获取扬声器然后在插入中使用它来实现。

标签: javascript node.js mongodb mongoose mean-stack


【解决方案1】:

我认为你必须按顺序进行:

let email; //you know this email
let events;// prepared events data but without speaker id

Attendee.findOne({email: email}).then(result=>{
    events.forEach(event=>event.speaker = result._id);
    return events:
})
.then(events=>{
    return Event.insertMany(events);
})
.then(results=>{
    /*something results handle*/
})
.catch(err=>{
    throw err;
})

【讨论】:

  • 我试图避免按顺序执行,但这绝对有效。我最终使用了 Attendee.find({speaker : true}) 返回所有发言者的列表,然后创建了一个地图,其中电子邮件作为键,id 作为值。然后我准备了我的事件列表并使用了 Event.insertMany(events);
猜你喜欢
  • 2017-04-20
  • 2018-06-08
  • 2016-07-02
  • 2012-07-03
相关资源
最近更新 更多