Mongodb 如何按照内嵌文档的某个字段排序?

发布于 2022-09-05 20:44:10 字数 1207 浏览 28 评论 0

现有数据如下

{
    "_id" : ObjectId("5992c90beeb45634df1c2be4"),
    "name" : "测试数据1",
    "status" : {
        "product" : [ 
            {
                "id" : ObjectId("59a37f7aef887a1d58b59f4f"),
                "sort" : 2
            }, 
            {
                "id" : ObjectId("59a37f7bef887a1d58b59f50"),
                "sort" : 54
            }, 
            {
                "id" : ObjectId("59a3801cef887a1d58b59f55"),
                "sort" : 66
            }
        ],
        "line":[]
    }
},
{
    "_id" : ObjectId("599e7dc07780bbfa9bee42a9"),
    "name" : "test数据2",
    "status" : {
        "product" : [ 
            {
                "id" : ObjectId("59a37f7aef887a1d58b59f4f"),
                "sort" : 1
            }, 
            {
                "id" : ObjectId("59a37f7bef887a1d58b59f50"),
                "sort" : 30
            }, 
            {
                "id" : ObjectId("59a3801cef887a1d58b59f55"),
                "sort" : 60
            }
        ],
        "line":[]
    }
}
......

我想要把整个集合按照status.product里的id=ObjectId("59a37f7aef887a1d58b59f4f")的数据对应的sort字段进行倒序排序,查询语句应该怎么写呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

記憶穿過時間隧道 2022-09-12 20:44:10

数组索引的结构决定了这样的需求没有办法利用索引来排序,所以只能使用内存排序,那么如果需要排序的数据量很大,性能势必很差。不过是可以做的。不知道你最后想要什么样的数据,所以先写成这样,可以自己再编辑成你要的格式:

db.test.aggregate([
    {$match: {"status.product.id": ObjectId("59a37f7aef887a1d58b59f4f")}},
    {$unwind: "$status.product"},
    {$match: {"status.product.id": ObjectId("59a37f7aef887a1d58b59f4f")}},
    {$sort: {"status.product.sort": 1}}
]);

或者可以写成

db.test.find({
    "status.product.id": ObjectId("59a37f7aef887a1d58b59f4f")
}, {
    "status.product.$": 1,
    "status.product.line": 1,
    name: 1
}).sort({"status.product.sort": 1});

出来的结果大致相同,格式上有点不一样。不妨自己理解下,如果有困难再讨论。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文