我从我的应用程序中调用了一个查询,向我提供了我数据库中的分页结果
const query = [
{
"$match" : {
"$or" : [
{ "expires_at" : { "$gt" : moment().toISOString() }},
{ "expires_at" : null }
],
"vendor_category" : {
"$nin" : ignoredCategories
}
}
},
{
"$lookup": {
"from": models.retailers.collection.name,
"localField": "retailer",
"foreignField": "_id",
"as": "retailer"
}
},
{
"$lookup": {
"from": models.categories.collection.name,
"localField": "category",
"foreignField": "_id",
"as": "category"
}
},
{
"$sort": {
"category.popularity" : -1,
...sortBy
}
},
{ "$unwind": "$retailer" },
{ "$unwind": "$category" },
{ "$skip" : skip },
{ "$limit" : limit }
]这主要是起作用的,我的两个$lookup和$unwind对象将其他集合加入到结果中,我的$sort对象根据产品类别的流行程度正确地对根查询进行排序。
但是,我的$match对象只返回大约18 ( 72)个结果。这很好,除非我运行const total = await models.products.countDocuments(query[0].$match)时,所以使用匹配查询来计数文档,我得到了72。所以两者之间是不匹配的。
那么剩下的结果发生了什么呢?我在这个查询中做错什么了吗?这绝对是我编写的第一个聚合查询,所以可能我完全遗漏了什么。欢迎任何提示/问题/优化!如果你需要更多的信息,请告诉我。
这里的编辑是扩展的匹配查询的一个例子。当我使用Model.find时,它运行得很好,但是由于我一直在隔离查询的各个部分,这似乎是罪魁祸首。其目的是只提取过期时间大于当前时间或字段为null的结果。数据来自刮板,有时我没有过期的数据。我也排除了一串类别,这是一个安全的显示项目,使它通过刮刀,但我不想在网站上。
$match : {
$or : [
{ expires_at : { $gt : moment().toISOString() }},
{ expires_at : null }
],
vendor_category : {
$nin : [ 'ID-6', 'ID-8', 'ID-283', 'ID-288', 'ID-354', 'ID-513', 'ID-654', 'ID-659', 'ID-33', 'ID-450', 'ID-497', 'ID-59', 'ID-404', 'ID-337']
}
}发布于 2019-06-07 14:45:24
好的,在挖掘和挖掘之后,我找到了一个github问题,它解决了我的问题,希望这将在将来帮助其他人。当使用Model.aggregate时,猫鼬不会抛出它的参数。
如果您希望与使用Model.aggregate的日期匹配,则必须将日期包装在new Date()中。
最初我做的是不起作用的事情:{ expires_at : { $gte : moment().toISOString() }}
并将其更改为以下内容:{ expires_at : { $gte : new Date(moment().toISOString()) }}
https://stackoverflow.com/questions/56481243
复制相似问题