mongoengine 对 _id 的聚合查找不起作用

问题描述 投票:0回答:1

活动记录

{
  "_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 键中的数组。

但是附加密钥变空了。

python mongodb mongoengine
1个回答
0
投票

问题是您将

campaignId
作为字符串类型存储在 Booking 集合中。在比较之前,请确保要比较的两个值必须是相同的类型。因此,您需要将 Booking 集合中文档的
campaignId
转换为
ObjectId
类型,如下所示:

db.Campaign.aggregate([
  {
    "$lookup": {
      "from": "Booking",
      let: {
        campaignId: "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$$campaignId",
                {
                  $toObjectId: "$campaignId"
                }
              ]
            }
          }
        }
      ],
      "as": "attaches"
    }
  }
])

演示@Mongo Playground

© www.soinside.com 2019 - 2024. All rights reserved.