活动记录
{
"_id": {
"$oid": "64eb81337f7d9f6e1107fc3a"
},
"_cls": "CampaignModel",
"campaignNumber": "CMPN-00005",
"account": {
"$oid": "64d80694fe75052b39c0e615"
},
"campaignName": "title",
"campaignDescription": "wdesc",
"campaignStartDate": {
"$date": "2023-08-17T00:00:00.000Z"
},
"campaignEndDate": {
"$date": "2023-08-27T00:00:00.000Z"
},
"isWorkOrderGeneratedFlag": false,
"isInvoiceGenerated": false,
"campaignCost": "20000",
"clientName": "",
"attachedBillboardList": [],
"accountId": "64d80694fe75052b39c0e615"
}
预订记录
{
"_id": {
"$oid": "64eb81337f7d9f6e1107fc3b"
},
"_cls": "BookingModel",
"campaignId": "64eb81337f7d9f6e1107fc3a",
"billboardId": "64e0d18aaec5d7ef7bf848dd",
"startDate": {
"$date": "2023-09-01T00:00:00.000Z"
},
"endDate": {
"$date": "2023-09-10T00:00:00.000Z"
},
"costPerDay": 200,
"billboard": {
"_ref": {
"$ref": "BillBoard",
"$id": {
"$oid": "64e0d18aaec5d7ef7bf848dd"
}
},
"_cls": "BillBoardModel"
}
}
我正在尝试通过活动记录中的_id 和预订记录中的campaignId 进行预订来加入活动
活动 Mongoengine 类
class CampaignModel(BaseModel):
meta = {'collection': 'Campaign'}
campaignNumber = me.SequenceField(sequence_name="CAMPAIGN", value_decorator=generate_campaign_number)
account = me.ReferenceField(UserModel)
campaignName = me.StringField()
campaignDescription = me.StringField()
campaignStartDate = me.DateField(default=datetime.datetime.now)
campaignEndDate = me.DateField(default=datetime.datetime.now)
isWorkOrderGeneratedFlag = me.BooleanField(default=False)
isInvoiceGenerated = me.BooleanField(default=False)
campaignCost = me.StringField()
clientName = me.StringField()
attachedBillboardList = me.ListField()
预订Mongoengine课程
class BookingModel(BaseModel):
meta = {'collection': 'Booking'}
campaignId = me.StringField()
campaign = me.LazyReferenceField(CampaignModel,dbref=False)
billboardId = me.StringField()
accountId = me.StringField()
billBoard = me.LazyReferenceField(BillBoardModel,dbref=False)
startDate = me.DateField()
endDate = me.DateField()
costPerDay = me.FloatField()
查询
records = CampaignModel.objects.aggregate(*[
{
"$lookup": {
"from": "Booking", # Tag collection database name
"localField": "_id", # Reference field
"foreignField": "campaignId", # Primary key of the Tag collection
"as": "attaches"
}
}])
预计: 来自活动集合的记录以及来自 Booking 集合的记录作为attahes 键中的数组。
但是附加密钥变空了。
问题是您将
campaignId
作为字符串类型存储在 Booking 集合中。在比较之前,请确保要比较的两个值必须是相同的类型。因此,您需要将 Booking 集合中文档的 campaignId
转换为 ObjectId
类型,如下所示:
db.Campaign.aggregate([
{
"$lookup": {
"from": "Booking",
let: {
campaignId: "$_id"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$$campaignId",
{
$toObjectId: "$campaignId"
}
]
}
}
}
],
"as": "attaches"
}
}
])