【问题标题】:MongoDB Aggregate Array LengthMongoDB聚合数组长度
【发布时间】:2017-07-31 16:12:14
【问题描述】:

我正在开发一个简单的 dev-meet-designer 平台,我正在尝试创建一个更好的流行度排名算法。

我现有的代码是:

project_collection.aggregate([
        { "$project": { 
            "score": {
              "$divide": [
                "$views",
                { "$divide": [
                    { "$subtract": [ 
                        new Date(), 
                        "$created_at" 
                    ]},
                    10*60*30
                ]}
            ]},
            "created_at": 1,
            "views": 1
        }}
      ], function(error, results) {
          // do stuff
      });

我想切换代码以计算文档中的likers 数组,并使用该值代替$views。非常感谢任何帮助!

这是一个示例文档结构:

{
    "_id" : ObjectId("53d95d33a3ca780d096e5e7e"),
    "name" : "Foo",
    "tagline" : "This is a test project.",
    "description" : "Foo bar.",
    "tags" : [ 
        "front end"
    ],
    "owner" : "Noah",
    "views" : 2,
    "activity" : [ 
        {
            "options" : {
                "type" : "started",
                "owner" : "Noah"
            }
        }, 
        {
            "options" : {
                "type" : "application",
                "applicant" : "John"
            }
        }
    ],
    "closed" : false,
    "finished" : false,
    "applicants" : [ "John" ],
    "partners" : [],
    "chat" : [],
    "discussion" : [],
    "url" : "",
    "fireQuene" : [],
    "likers" : [ "John", "Noah" ],
    "created_at" : ISODate("2014-07-30T21:01:39.421Z")
}

【问题讨论】:

  • 您应该在问题中发布文档结构以使其更清晰。没有它,很难判断查询应该是什么样子。
  • 如果我使用上面的代码和示例文档,结果的 JSON 将是:[{"_id" : ObjectId("53d95d33a3ca780d096e5e7e"), "views" : 3, "created_at" : ISODate("2014-07-30T21:01:39.421Z"), "score" : 0.0001253727907694868}], @ChristianP。

标签: javascript node.js mongodb database


【解决方案1】:

为了获得您的问题所要求的“数组长度”,MongoDB 2.6 引入了$size 运算符,它返回数组的长度。在您的算法中用于代替“$views”,这将是:

project_collection.aggregate([
        { "$project": { 
            "score": {
              "$divide": [
                { "$size": "$likers" },
                { "$divide": [
                    { "$subtract": [ 
                        new Date(), 
                        "$created_at" 
                    ]},
                    10*60*30
                ]}
            ]},
            "created_at": 1,
            "views": 1
        }}
      ], function(error, results) {
          // do stuff
      });

如果您有一个没有此功能的早期版本,那么您需要在阵列上使用$unwind 并使用$sum 来获取计数。这你可以进入$group 阶段:

project_collection.aggregate([
        { "$unwind": "$likers" },
        { "$group": {
            "_id": "$_id",
            "created_at": { "$first": "$created_at" },
            "likers": { "$push": "$likers" },
            "count": { "$sum": 1 }
        }},
        { "$project": {
            "score": {
              "$divide": [
                "$count",
                { "$divide": [
                    { "$subtract": [ 
                        new Date(), 
                        "$created_at" 
                    ]},
                    10*60*30
                ]}
            ]},
            "created_at": 1,
            "views": 1
        }}
      ], function(error, results) {
          // do stuff
      });

所以$size 可以帮助您完成您正在做的事情,但除此之外,尝试在您的文档中保留“喜欢”的人的“数量”并相应地更新它通常是一个好主意。

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 2013-01-12
    • 2013-07-31
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多