匹配 EmbedDocuments 中的两个字段
match both field in EmbedDocuments
我需要一些有关 mongoengine 过滤的帮助。我想做的是过滤嵌入文档中的 2 个字段。我希望两者在同一文档中匹配,但我不知道如何以这种方式包含它。
示例数据:
{
"_id" : "1",
"active" : true,
"booking" : [
{
"date" : 1,
"status" : true
}
]
}
{
"_id" : "2",
"active" : true,
"booking" : [
{
"date" : 1,
"status" : false
},
{
"date" : 2,
"status" : true
}
]
}
我想查询 day=1 & status=true
并且只得到 #1 作为结果。但是,此查询会 return #1 和 #2,因为日期和状态都可以跨文档存在。
docs.objects.filter(
Q(active=True) & Q(booking__date=1) & Q(booking__status=True))
我尝试了一些不同的方法,但它们给出的结果与我的预期相去甚远。比如这些 return 空的。
match = {"$match": {
"booking.date": 1,
"booking.status": True
}}
objects = docs.objects.aggregate(match)
或
match = {"$match": {
"$and": [
{
"booking.date": 1,
"booking.status": True
}
]
}}
有人可以指点一下吗?
您的答案是:
class Booking(EmbeddedDocument):
date = IntField()
status = BooleanField(default=True)
class Account(Document):
active = BooleanField(default=True)
booking = EmbeddedDocumentListField(Booking)
Account.objects(active=True, booking=Booking(date=1, status=True))
重点是我用整个EmbeddedDocument
作为匹配条件。另外 Q(active=True) & Q(booking__date=1) & Q(booking__status=True)
完全等同于 active=True, booking__date=1, booking__status=True
我需要一些有关 mongoengine 过滤的帮助。我想做的是过滤嵌入文档中的 2 个字段。我希望两者在同一文档中匹配,但我不知道如何以这种方式包含它。
示例数据:
{
"_id" : "1",
"active" : true,
"booking" : [
{
"date" : 1,
"status" : true
}
]
}
{
"_id" : "2",
"active" : true,
"booking" : [
{
"date" : 1,
"status" : false
},
{
"date" : 2,
"status" : true
}
]
}
我想查询 day=1 & status=true
并且只得到 #1 作为结果。但是,此查询会 return #1 和 #2,因为日期和状态都可以跨文档存在。
docs.objects.filter(
Q(active=True) & Q(booking__date=1) & Q(booking__status=True))
我尝试了一些不同的方法,但它们给出的结果与我的预期相去甚远。比如这些 return 空的。
match = {"$match": {
"booking.date": 1,
"booking.status": True
}}
objects = docs.objects.aggregate(match)
或
match = {"$match": {
"$and": [
{
"booking.date": 1,
"booking.status": True
}
]
}}
有人可以指点一下吗?
您的答案是:
class Booking(EmbeddedDocument):
date = IntField()
status = BooleanField(default=True)
class Account(Document):
active = BooleanField(default=True)
booking = EmbeddedDocumentListField(Booking)
Account.objects(active=True, booking=Booking(date=1, status=True))
重点是我用整个EmbeddedDocument
作为匹配条件。另外 Q(active=True) & Q(booking__date=1) & Q(booking__status=True)
完全等同于 active=True, booking__date=1, booking__status=True