我的代码有点脏,我想不出改进它的方法,我能做些啥来获得更紧凑和更好的解决方案?
Posted
技术标签:
【中文标题】我的代码有点脏,我想不出改进它的方法,我能做些啥来获得更紧凑和更好的解决方案?【英文标题】:i have a code that its kinda dirty and i cant think of a way to improve it, what can i do to have a more compact and better solution?我的代码有点脏,我想不出改进它的方法,我能做些什么来获得更紧凑和更好的解决方案? 【发布时间】:2022-01-17 11:54:05 【问题描述】:我正在尝试在猫鼬中获取我的数据库的特定结果,但这就是我的工作,但代码看起来很糟糕。
const completedOrders = await Order.find( "status": "delivered" ).
populate('address');
数据库的响应是这样的,我试图获取每个订单的所有状态,状态为:“已交付”
"completedOrders": [
"_id": "61b81eef631dcc413e98515a",
"user": "61b51dcbfd50717dc6dc931a",
"address":
"address":
"phone": 54156345645768,
"rut": "26.232.966-6",
"state": "metropolitana",
"city": "dunno",
"province": "pepe",
"street": "asdaqqqqqqqda",
"numstreet": 999
,
"_id": "61b8179e7dfc15f26c561175",
"user": "61b51dcbfd50717dc6dc931a",
"__v": 0
,
"status": "delivered",
"orderItems": [
"61b81ee6631dcc413e985146",
"61b81ee6631dcc413e985147"
],
"shipping": 3500,
"code": "c986aeb3-1fc9-422e-8638-b40651d7906c",
"total": 690,
"totalCost": 370,
"createdAt": "2021-12-14T04:34:55.564Z",
"updatedAt": "2021-12-14T04:34:55.564Z"
,
"_id": "61b81fddda2eb87de7d44c42",
"user": "61b51dcbfd50717dc6dc931a",
"address":
"address":
"phone": 54156345645768,
"rut": "26.232.966-6",
"state": "metropolitana",
"city": "dunno",
"province": "pepe",
"street": "asdaqqqqqqqda",
"numstreet": 999
,
"_id": "61b8179e7dfc15f26c561175",
"user": "61b51dcbfd50717dc6dc931a",
"__v": 0
,
"status": "delivered",
"orderItems": [
"61b81fdbda2eb87de7d44c32",
"61b81fdbda2eb87de7d44c33"
],
"shipping": 3500,
"code": "e2828a65-ea12-43e9-9909-f081c9cd32e9",
"total": 690,
"totalCost": 370,
"createdAt": "2021-12-14T04:38:53.517Z",
"updatedAt": "2021-12-14T04:38:53.517Z"
]
所以这是我尝试过的,但它很脏,我仍然想为城市和省份做同样的事情,这是为了我的电子商务分析
const AddressesUser = await Promise.all(completedOrders.map(async (array) =>
const allAddresses = array.address;
return allAddresses;
));
const arrayAddresses = await Promise.all(AddressesUser.map(async (array) =>
const allAddresses = array.address;
return allAddresses;
));
const allStates = await Promise.all(arrayAddresses.map(async (array) =>
const states = array.state;
return states;
));
【问题讨论】:
首先,没有理由对最后一个代码块中的三个.map()
函数中的任何一个使用 Promise。这些操作都不是异步的,所以使用 Promise 只是浪费。只需使用普通的.map()
。
如果您要构建所有三个数组,那么您最好只迭代对象数组一次并一次收集所有三个数组,而不是对数据进行三个单独的迭代。跨度>
@jfriend00 出于某种原因,如果我不使用 Promise,我的所有值都会为空,而且关于迭代,我一定是个白痴,我不知道为什么我以前没想过,我刚开始使用 nodejs。 ...
Promise 仅用于管理异步操作。我在您的.map()
中看不到任何异步操作。请出示minimal, reproducible, example。由于这只是普通的 javascript,您甚至应该能够在问题中内置的代码 sn-p 中对其进行演示。我怀疑你只是没有以某种方式正确使用.map()
。
您可以避免数组操作。编写带有适当预测(和/或其他操作)的aggregation 查询以获得所需的结果。此外,还不清楚预期的输出是什么。
【参考方案1】:
如果您希望 state 字段位于顶层,您可以使用聚合:
["$match":"status":"delivered","$addFields":"state":"$address.address.state","$project":"state":1,"status":1]
如果您需要任何其他参数,只需在项目阶段添加即可。
如果你只想要状态键,这个聚合流也会有帮助:
["$match":"status":"delivered","$replaceRoot":"newRoot":"state":"$address.address.state"]
这将替换根,并且所有高于该级别的键都将被删除。
【讨论】:
你的回答很有趣,我不知道猫鼬的那种方法,但不幸的是不起作用,因为如果我使用这种方法,我将无法使用填充来带来地址,尽管谢谢! 填充地址,您可以使用聚合的查找阶段。["$match": "status": "delivered","$lookup": "from": "address", "localField": "address", "foreignField": "_id", "as": "address" ,"$unwind": "path": "$address", "preserveNullAndEmptyArrays": true ]
获取您想要的字段,您可以使用项目进行过滤
解释字段正在做什么以便于参考lookup.from -> add your collection name which is storing address
lookup.localField-> the key in users who is having reference to address model
lookup.foreignField-> address foreign key
lookup.as -> the key in which you want the result
unwind -> this will convert address array into object
`preserveNullAndEmptyArrays->这将告诉保留对象或不具有地址的对象空`以上是关于我的代码有点脏,我想不出改进它的方法,我能做些啥来获得更紧凑和更好的解决方案?的主要内容,如果未能解决你的问题,请参考以下文章
ESP8266:我能做些啥来克服“部分 `.text' 将不适合区域 `iram1_0_seg'”?
我想创建 React Native App,但收到此错误。我能做些啥?