Mongoengine 聚合不像 mongo
Mongoengine aggregate doesn't work like mongo
我有一个 Mongo 文档,里面有一个嵌入式文档列表(示例如下)。我正在尝试 运行 一个聚合,该聚合将 return 仅包含列表中匹配对象的完整文档。
示例集合数据
{
"make": "Toyota",
"color": "blue",
"tires": [{
"make": "Mishlen",
"size": 185
}, {
"make": "Mishlen",
"size": 210
}]
}
我设法通过以下查询使其在 MongoDB 中工作
db.cars.aggregate(
[
{
$match: {$and: [{"tires.size": {$gt: 200}}]}
},
{
$addFields: {
"tires": {
$filter: {
input: '$tires',
as: 'tires',
cond: {$gt: ['$$tires.size', 200]}
}
}
}
},
{
$limit: 100
},
{
$skip: 0
}
])
我正在尝试 运行 mongoengine 中的相同聚合,但它每次都是 return 一个空列表。
pipeline = [
{
"$match": {"$and": [{"tires.size": {"$gt": 200}}]}
},
{
"$addFields": {
"tires": {
"$filter": {
"input": "$tires",
"as": "tires",
"cond": {"$and": [{"$gt": ["$$tires.size", 200]}]}
}
}
}
}
]
self.obj_type.objects.aggregate(*pipeline)
我做错了什么?
更新
我的问题比我想象的要简单得多,我错过了我在 python 中将数字作为字符串而不是 int 传递。感谢大家的帮助
下面的工作流程是最简单的
pipeline = [
{
$unwind: "$tires"
},
{
"$match": {"$and": [{"tires.size": {"$gt": 200}}]}
},
{
$group : {
_id : "$make",
tires: { $push: "$tires" }
}
}
]
self.obj_type.objects.aggregate(*pipeline)
插入您提供的示例文档后,我对 运行 使用您提供的管道进行聚合没有任何特殊问题。见下文:
class Tire(EmbeddedDocument):
make = StringField()
size = IntField()
class Car(Document):
make = StringField()
color = StringField()
tires = EmbeddedDocumentListField(Tire)
meta = {'collection': 'cars'}
pipeline = [
{
"$match": {"$and": [{"tires.size": {"$gt": 200}}]}
},
{
"$addFields": {
"tires": {
"$filter": {
"input": "$tires",
"as": "tires",
"cond": {"$and": [{"$gt": ["$$tires.size", 200]}]}
}
}
}
}
]
# Verify aggregation pipeline runs fine with the driver (pymongo)
coll = Car._get_collection()
pymongo_result = list(coll.aggregate(pipeline))
assert len(pymongo_result) == 1
# Run same aggregation pipeline with MongoEngine
mongoengine_result = list(Car.objects.aggregate(*pipeline))
assert len(mongoengine_result) == 1
result = [
{'_id': ObjectId('5e0a5c8e7c57cd9b300710fb'),
'color': 'blue',
'make': 'Toyota',
'tires': [{'make': 'Mishlen', 'size': 210.0}]
}
]
assert mongoengine_result == pymongo_result == result
我使用了最新的 mongoengine 版本,但据我所知,最近 MongoEngine 的聚合包装器没有重大变化。问题可能出在您的 self.obj_type.objects
中,请像我一样尝试使用新的查询集(即 YourDocumentClass.objects
),看看它是否有所作为。
我有一个 Mongo 文档,里面有一个嵌入式文档列表(示例如下)。我正在尝试 运行 一个聚合,该聚合将 return 仅包含列表中匹配对象的完整文档。
示例集合数据
{
"make": "Toyota",
"color": "blue",
"tires": [{
"make": "Mishlen",
"size": 185
}, {
"make": "Mishlen",
"size": 210
}]
}
我设法通过以下查询使其在 MongoDB 中工作
db.cars.aggregate(
[
{
$match: {$and: [{"tires.size": {$gt: 200}}]}
},
{
$addFields: {
"tires": {
$filter: {
input: '$tires',
as: 'tires',
cond: {$gt: ['$$tires.size', 200]}
}
}
}
},
{
$limit: 100
},
{
$skip: 0
}
])
我正在尝试 运行 mongoengine 中的相同聚合,但它每次都是 return 一个空列表。
pipeline = [
{
"$match": {"$and": [{"tires.size": {"$gt": 200}}]}
},
{
"$addFields": {
"tires": {
"$filter": {
"input": "$tires",
"as": "tires",
"cond": {"$and": [{"$gt": ["$$tires.size", 200]}]}
}
}
}
}
]
self.obj_type.objects.aggregate(*pipeline)
我做错了什么?
更新
我的问题比我想象的要简单得多,我错过了我在 python 中将数字作为字符串而不是 int 传递。感谢大家的帮助
下面的工作流程是最简单的
pipeline = [
{
$unwind: "$tires"
},
{
"$match": {"$and": [{"tires.size": {"$gt": 200}}]}
},
{
$group : {
_id : "$make",
tires: { $push: "$tires" }
}
}
]
self.obj_type.objects.aggregate(*pipeline)
插入您提供的示例文档后,我对 运行 使用您提供的管道进行聚合没有任何特殊问题。见下文:
class Tire(EmbeddedDocument):
make = StringField()
size = IntField()
class Car(Document):
make = StringField()
color = StringField()
tires = EmbeddedDocumentListField(Tire)
meta = {'collection': 'cars'}
pipeline = [
{
"$match": {"$and": [{"tires.size": {"$gt": 200}}]}
},
{
"$addFields": {
"tires": {
"$filter": {
"input": "$tires",
"as": "tires",
"cond": {"$and": [{"$gt": ["$$tires.size", 200]}]}
}
}
}
}
]
# Verify aggregation pipeline runs fine with the driver (pymongo)
coll = Car._get_collection()
pymongo_result = list(coll.aggregate(pipeline))
assert len(pymongo_result) == 1
# Run same aggregation pipeline with MongoEngine
mongoengine_result = list(Car.objects.aggregate(*pipeline))
assert len(mongoengine_result) == 1
result = [
{'_id': ObjectId('5e0a5c8e7c57cd9b300710fb'),
'color': 'blue',
'make': 'Toyota',
'tires': [{'make': 'Mishlen', 'size': 210.0}]
}
]
assert mongoengine_result == pymongo_result == result
我使用了最新的 mongoengine 版本,但据我所知,最近 MongoEngine 的聚合包装器没有重大变化。问题可能出在您的 self.obj_type.objects
中,请像我一样尝试使用新的查询集(即 YourDocumentClass.objects
),看看它是否有所作为。