我的代码有点脏,我想不出改进它的方法,我能做些啥来获得更紧凑和更好的解决方案?

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 addresslookup.localField-> the key in users who is having reference to address modellookup.foreignField-> address foreign keylookup.as -> the key in which you want the resultunwind -> this will convert address array into object`preserveNullAndEmptyArrays->这将告诉保留对象或不具有地址的对象空`

以上是关于我的代码有点脏,我想不出改进它的方法,我能做些啥来获得更紧凑和更好的解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

我能做些啥来解决“1 次提交落后于主人”?

ESP8266:我能做些啥来克服“部分 `.text' 将不适合区域 `iram1_0_seg'”?

查询很慢,我可以做些啥来改进?

我想创建 React Native App,但收到此错误。我能做些啥?

GooglePlaces API 使我的应用程序文件变大。对此我能做些啥吗?

*** / SignalR 无法协同工作。我能做些啥?