MongoDB - Запрос полей с префиксом доллара - PullRequest
0 голосов
/ 12 марта 2019

Итак, у меня есть схема, которая выглядит так:

class Timeline(mongoengine.Document):

    # Who
    user = mongoengine.ReferenceField(User, required=True)

    # When
    date = mongoengine.DateTimeField(default=datetime.utcnow())

    # What
    category = mongoengine.StringField(choices=CATEGORIES, required=True)
    event_type = mongoengine.StringField(choices=EVENT_TYPES, required=True)
    reference_field = mongoengine.GenericReferenceField(
        choices=REFERENCE_FIELDS,
        required=True
    )
    summary = mongoengine.StringField(required=True)
    description = mongoengine.StringField()

И график времени документ, подобный этому:

"_id": ObjectId("5c864a14bbf999c8aa8bf26c"),
"reference_field" : {
        "_cls" : "Issue",
        "_ref" : {
            "$ref" : "issue",
            "$id" : ObjectId("5c864a14bbf999c8aa8bf26b")
        }
    },
"date": Something

Я хочу знать, как я могу запросить GenericReferenceField. Поскольку внутри _ref перед полем id находится $, я не знаю, как сделать запрос, поскольку $ означает что-то отличное от Mongo.

Например, у меня есть запрос агрегации, такой как требуется, поле $id:

{ "$lookup": {
        "from": "comment",
        "let": { "reference_field": "$reference_field._ref.$id" }
        "pipeline": [
          { "$match": {
            "$expr": { "$eq": ["$$reference_field", "$_id"] },
            "project_id": ObjectId("5c6d37d2bbf9994627d5f4f5")
          }}
        ],
        "as": "Comment"
      }
   }

Сверху для строки "let": { "reference_field": "$reference_field._ref.$id" } требуется $id, но я получаю ошибку FieldPath. Это, очевидно, связано с тем, что $ означает что-то еще для mongoShell. Следовательно, для того, чтобы использовать поле идентификатора или извлечь ссылочный объект, сохраненный в поле идентификатора, не происходит.

Чего я хочу добиться - это получить объект Comment, на который ссылается документ timeline, который хранится в поле reference_field.

Таким образом,

Как вы запрашиваете поля, которые начинаются с $?

...