【问题标题】:Mongo DB Sorting issue with Ascending orderMongodb排序问题与升序
【发布时间】:2016-07-13 21:06:07
【问题描述】:

我有一个名为“formTest123”的集合,其中包含以下记录:

     /* 0 */
{
    "_id" : ObjectId("5784f5aeef31a98294231459"),
    "data" : [ 
        {
            "name" : "Amir",
            "Other" : [ 
                {
                    "data" : {
                        "city" : {
                            "address" : "pncjj"
                        }
                    }
                }, 
                {
                    "data" : {
                        "state" : {
                            "address" : "xyz"
                        }
                    }
                }
            ]
        }
    ]
}

/* 1 */
{
    "_id" : ObjectId("5784f62cef31a9829423145a"),
    "data" : [ 
        {
            "name" : "Zssmir",
            "Other" : [ 
                {
                    "data" : {
                        "city" : {
                            "address" : "bncd"
                        }
                    }
                }, 
                {
                    "data" : {
                        "state" : {
                            "address" : "gyk"
                        }
                    }
                }
            ]
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5784f636ef31a9829423145b"),
    "data" : [ 
        {
            "name" : "Cmir",
            "Other" : [ 
                {
                    "data" : {
                        "city" : {
                            "address" : "tuhn"
                        }
                    }
                }, 
                {
                    "data" : {
                        "state" : {
                            "address" : "knm"
                        }
                    }
                }
            ]
        }
    ]
}

当我查询这个集合时:

db.formTest123.find().sort( { "data.Other.data.city.address" : -1})

表示按降序给出正确的输出:

    /* 0 */
{
    "_id" : ObjectId("5784f636ef31a9829423145b"),
    "data" : [ 
        {
            "name" : "Cmir",
            "Other" : [ 
                {
                    "data" : {
                        "city" : {
                            "address" : "tuhn"
                        }
                    }
                }, 
                {
                    "data" : {
                        "state" : {
                            "address" : "knm"
                        }
                    }
                }
            ]
        }
    ]
}

/* 1 */
{
    "_id" : ObjectId("5784f5aeef31a98294231459"),
    "data" : [ 
        {
            "name" : "Amir",
            "Other" : [ 
                {
                    "data" : {
                        "city" : {
                            "address" : "pncjj"
                        }
                    }
                }, 
                {
                    "data" : {
                        "state" : {
                            "address" : "xyz"
                        }
                    }
                }
            ]
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5784f62cef31a9829423145a"),
    "data" : [ 
        {
            "name" : "Zssmir",
            "Other" : [ 
                {
                    "data" : {
                        "city" : {
                            "address" : "bncd"
                        }
                    }
                }, 
                {
                    "data" : {
                        "state" : {
                            "address" : "gyk"
                        }
                    }
                }
            ]
        }
    ]
}

但是当我查询时:

 db.formTest123.find().sort( { "data.Other.data.city.address" : 1})

按照“city.address”的升序排列:

    /* 0 */
    {
    "_id" : ObjectId("5784f5aeef31a98294231459"),
    "data" : [ 
        {
            "name" : "Amir",
            "Other" : [ 
                {
                    "data" : {
                        "city" : {
                            "address" : "pncjj"
                        }
                    }
                }, 
                {
                    "data" : {
                        "state" : {
                            "address" : "xyz"
                        }
                    }
                }
            ]
        }
    ]
}

/* 1 */
{
    "_id" : ObjectId("5784f62cef31a9829423145a"),
    "data" : [ 
        {
            "name" : "Zssmir",
            "Other" : [ 
                {
                    "data" : {
                        "city" : {
                            "address" : "bncd"
                        }
                    }
                }, 
                {
                    "data" : {
                        "state" : {
                            "address" : "gyk"
                        }
                    }
                }
            ]
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5784f636ef31a9829423145b"),
    "data" : [ 
        {
            "name" : "Cmir",
            "Other" : [ 
                {
                    "data" : {
                        "city" : {
                            "address" : "tuhn"
                        }
                    }
                }, 
                {
                    "data" : {
                        "state" : {
                            "address" : "knm"
                        }
                    }
                }
            ]
        }
    ]
}

这显然是错误的,因为现在记录没有按“city.address”按升序排序

谁能猜出升序有什么问题?

【问题讨论】:

    标签: mongodb sorting


    【解决方案1】:

    这是因为它是从“最低”到“最高”的顺序。

    问题是,未定义和/或 null 的值比任何现有数字都“低”。

    当您按数组排序时,它会查看该数组中的所有文档并取最小值,该值在包含状态的文档中为“未定义”。

    例如,如果您将具有足够高价值的“city.address”添加到您的所有文档中,它将适用于升序。喜欢这个:

            "Other" : [ 
                {
                    "data" : {
                        "city" : {
                            "address" : "tuhn"
                        }
                    }
                }, 
                {
                    "data" : {
                        "state" : {
                            "address" : "knm"
                        }
                        "city" : {
                            "address" : "zzzzzzzzzzzzzzzzz"
                        }
                    }
                }
            ]
    

    注意:对于降序,它取最大值,因此它“有效”,因为任何 city.address 都会覆盖所有 null 和 undefined。

    如果您需要升序并且不想更改数据结构,如果可能的话,我建议您先降序排序,然后以编程方式倒序。

    【讨论】:

      【解决方案2】:

      由于字段“Other”是(子)文档的数组,我们必须指定子文档的索引。 根据所指定的架构,以下工作。

      db.formTest123.find().sort( { "data.Other.0.data.city.address" : 1});
      

      db.formTest123.find().sort( { "data.Other.0.data.city.address" : -1});
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-29
        • 2021-02-01
        • 1970-01-01
        • 2022-11-13
        • 2011-08-28
        • 1970-01-01
        • 2021-12-23
        相关资源
        最近更新 更多