Mongodb 猫鼬聚集改进

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

给定这个数据集和这个mongodb,如何正确地将这个聚合转换成Mongoose

我已经包括了使用mongoose的代码,这很有效,但我想知道这是否是正确的方法,以及这种聚合是否可以改进

谢谢

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")
        }
     }
  }
]