Итак, у меня есть схема, которая выглядит так:
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.
Таким образом,
Как вы запрашиваете поля, которые начинаются с $
?