繁体   English   中英

MongoDB:如何按数组字段对文档进行排序?

[英]MongoDB : How to sort documents by array field?

我需要按包含布尔值的数组字段对文档进行排序。

{
    "_id" : ObjectId("610024d989c5b829e72940c5"),
    "firstname" : "Christophe",
    "lastname" : "Pichon",
    "documents" : [
        {
            "mongoId" : "610024d90053e800143b0fd3",
            "status" : "notified",
            "signable" : true,
            "signed" : false
        },
        {
            "mongoId" : "610024d90053e800143b0fd5",
            "status" : "notified",
            "signable" : true,
            "signed" : false
        },
        {
            "mongoId" : "60fea9140053e800143b0f92",
            "status" : "notified",
            "signable" : false,
            "signed" : false
        },
        {
            "mongoId" : "610024d90053e800143b0fd7",
            "status" : "notified",
            "signable" : true,
            "signed" : false
        }
    ]
},
{
    "_id" : ObjectId("610024b189c5b829e72940c4"),
    "firstname" : "Paulette",
    "lastname" : "Besnard",
    "documents" : [
        {
            "mongoId" : "610024b00053e800143b0fc4",
            "status" : "notified",
            "signable" : true,
            "signed" : true
        },
        {
            "mongoId" : "610024b10053e800143b0fc6",
            "status" : "notified",
            "signable" : true,
            "signed" : false
        },
        {
            "mongoId" : "60fea9140053e800143b0f92",
            "status" : "notified",
            "signable" : false,
            "signed" : false
        },
        {
            "mongoId" : "610024b10053e800143b0fc8",
            "status" : "notified",
            "signable" : true,
            "signed" : false
        }
    ]
},
{
    "_id" : ObjectId("60febc9e89c5b829e72940c3"),
    "firstname" : "Louis",
    "lastname" : "Herve",
    "documents" : [
        {
            "mongoId" : "60febc9e0053e800143b0fb7",
            "status" : "notified",
            "signable" : true,
            "signed" : true
        },
        {
            "mongoId" : "60febc9e0053e800143b0fb9",
            "status" : "notified",
            "signable" : true,
            "signed" : true
        },
        {
            "mongoId" : "60fea9140053e800143b0f92",
            "status" : "notified",
            "signable" : false,
            "signed" : false
        },
        {
            "mongoId" : "60febc9e0053e800143b0fbb",
            "status" : "notified",
            "signable" : true,
            "signed" : false
        }
    ]
},

一旦排序,我需要这个结果:

{
    "_id" : ObjectId("60febc9e89c5b829e72940c3"),
    "firstname" : "Louis",
    "lastname" : "Herve",
},

{
    "_id" : ObjectId("610024b189c5b829e72940c4"),
    "firstname" : "Paulette",
    "lastname" : "Besnard",
},

{
    "_id" : ObjectId("610024d989c5b829e72940c5"),
    "firstname" : "Christophe",
    "lastname" : "Pichon",
},

作为 :

  • Louis 有 2/3(已签名/可签名)文件
  • 波莱特有 1/3
  • 克里斯托弗 0/3

所以我需要按签名对文档进行排序并检索签署最多文档的用户。

关于如何执行此操作的想法?

谢谢你的帮助

在您的收藏中尝试此查询

db.collectionName.aggregate([{
    "$project": {
        "firstname": "$firstname",
        "lastname": "$lastname",
        "signed": { // Count will be stored in "signed" field
            "$size": { // Get size of filtered documents
                "$filter": { // Filter out signed documents
                    "input": "$documents", "as": "item", "cond": { "$eq": ["$$item.signed", true] }
                }
            }
        },
        "signable": { // Count will be stored in "signable" field
            "$size": { // Get size of filtered documents
                "$filter": { // Filter out signable documents
                    "input": "$documents", "as": "item", "cond": { "$eq": ["$$item.signable", true] }
                }
            }
        }
    }
}, {
    "$sort": { // sorting users who signed the most documents
        "signed": -1,
        "signable": -1
    }
}]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM