Mongodb 猫鼬聚集改进
给定这个数据集和这个mongodb,如何正确地将这个聚合转换成Mongoose 我已经包括了使用mongoose的代码,这很有效,但我想知道这是否是正确的方法,以及这种聚合是否可以改进 谢谢Mongodb 猫鼬聚集改进,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,给定这个数据集和这个mongodb,如何正确地将这个聚合转换成Mongoose 我已经包括了使用mongoose的代码,这很有效,但我想知道这是否是正确的方法,以及这种聚合是否可以改进 谢谢 db.cars.aggregate( //De-normalized the nested array of accounts {"$unwind": "$accounts"}, //De-normalized the nested array of cars {"$unwi
db.cars.aggregate(
//De-normalized the nested array of accounts
{"$unwind": "$accounts"},
//De-normalized the nested array of cars
{"$unwind": "$accounts.cars"},
//match carId to 3C
{"$match": {"accounts.cars.carId" : "3C"}},
//Project the accounts.cars object only
{"$project" : {"accounts.cars" : 1}}
).pretty();
我正在努力改进的猫鼬版本:
Car.aggregate()
.unwind('accounts')
.unwind('accounts.cars')
.match({'accounts.cars.carId' : "3C"})
.project({"accounts.cars": 1, _id: 0})
.exec(function (err, carsObj) {});
以及数据集(汽车):
聚合返回的结果是:
[
{ accounts:
{ cars:
{
"carId" : "3C",
"_id" : ObjectId("51273329b64f07a40ef1c15e")
}
}
}
]
你认为“猫鼬语法”在这里是什么意思?语法是“相同”的,您正在编写的唯一例外实际上是一个通用约定,即您的整个管道实际上应该包含在一个数组中
[]
。这一点都没有区别,只是您可能应该再次使用$redact
或类似的方法来获得更优的效果,或者如果每个数组只有一个匹配项,甚至只使用$
操作符和.find()
。通过$unwind
过滤数组并不是很有效。@BlakesSeven非常感谢,我用更多信息和mongoose代码更新了我的问题;您是否有一些建议,比如如何通过使用$redact和$,或者通过避免$unwind来改进这一点?谢谢,直到完全不清楚你在问什么。您在mongoose中使用的那些“助手方法”并不是“必需的”,坦率地说,使用JavaScript这样的动态语言,您可以直接构建数据结构(聚合管道或MongoDB查询是什么),这似乎一点也不直观。你的新学期是“提高”,但如何提高?询问的目的是什么?需要什么不同的结果?我已经说过,如果您只希望每个文档有一个匹配项,那么最好使用.find()
。@BlakesSeven根据数据集中的模式,我希望获得我上面提到的重新调整的对象。我的模式有嵌套数组,我相信.find()和投影无法处理嵌套数组以获得与上面相同的返回obj。出于这个原因,我使用了聚合,这样我就可以$diswind数组和$match,最后是$project。我所说的“改进”是指,我想知道是否有一种方法可以使用.find()或不使用$unwind来获得相同的单一匹配,从而提高性能?再次感谢
[
{ accounts:
{ cars:
{
"carId" : "3C",
"_id" : ObjectId("51273329b64f07a40ef1c15e")
}
}
}
]