2015-07-09 5 views
6

मैं इस तरह की वस्तुओं के लिए उपयोगकर्ता के आवागमन को दिखाता है आइटम के साथ एक संग्रह है आइटम गिनती:MongoDB: तिथि के अनुसार आइटम गणना तो अद्वितीय

{"_id" : ObjectId("559d63ac2ea9e7b53ecc3275"), 
"user" : { 
    "id" : "65585", 
    "cookie" : "spzSznyfDeeFMptiKZqqDg" 
    }, 
"object_id" : "3", 
"createddate" : ISODate("2015-07-08T17:53:48.209Z")} 

मैं उन्हें object_id द्वारा और में दिन-प्रतिदिन समूहीकरण गिनती करने की आवश्यकता है प्रत्येक दिन अद्वितीय उपयोगकर्ताओं का चयन करें और उन्हें गिनें। अब मेरे पास कोड है जो दिए गए ऑब्जेक्ट के दृश्यों की गणना करता है और उस ऑब्जेक्ट को देखे गए उपयोगकर्ताओं की विशिष्ट सरणी का चयन करता है। अब मुझे इन उपयोगकर्ताओं को गिनने की जरूरत है। कोड है:

db.objects.aggregate([ 
{"$match": {createddate: {$gt : ISODate("2015-07-01T00:00:00.000Z"), $lte : ISODate("2015-07-15T00:00:00.000Z")}} }, 
{"$match": {object_id: '1'}}, 
{"$group": { 
    "_id": { 
     "$subtract": [ 
      "$createddate", 
      { "$mod": [ 
       { "$subtract": [ "$createddate", ISODate("1970-01-01T00:00:00.000Z") ] }, 
       1000 * 60 * 60 * 24 
      ]} 
     ] 
    }, 
    "users": { "$addToSet": "$user"}, 
    "totalviews": { "$sum": 1 } 
}}, 
{ "$sort": { "_id": -1 } } 
]) 

परिणाम है:

{ 
    "result" : [ 
     { 
      "_id" : ISODate("2015-07-08T00:00:00.000Z"), 
      "users" : [ 
       { 
        "id" : "65585", 
        "cookie" : "spzSznyfDeeFMptiKZqqDg" 
       }, 
       { 
        "id" : null, 
        "cookie" : "spzSznyfDeeFMptiKZqqDg" 
       } 
      ], 
      "totalviews" : 3 
     }, 
     { 
      "_id" : ISODate("2015-07-07T00:00:00.000Z"), 
      "users" : [ 
       { 
        "id" : null, 
        "cookie" : "spzSznyfDeeFMptiKZqqDg" 
       }, 
       { 
        "id" : "65585", 
        "cookie" : "spzSAAAAAAAAAAMptiKZqqDg" 
       }, 
       { 
        "id" : "65585", 
        "cookie" : "spzSznyfDeeFMptiKZqqDg" 
       } 
      ], 
      "totalviews" : 19 
     } 
    ], 
    "ok" : 1 
} 

लेकिन मैं परिणाम की जरूरत है जैसे:

{ 
    "result" : [ 
     { 
      "_id" : ISODate("2015-07-08T00:00:00.000Z"), 
      "userscount" : 2, 
      "totalviews" : 3 
     }, 
     { 
      "_id" : ISODate("2015-07-07T00:00:00.000Z"), 
      "userscount" : 3, 
      "totalviews" : 19 
     } 
    ], 
    "ok" : 1 
} 

कैसे MongoDB में यह प्रदर्शन करने के लिए कोई जानकारी नहीं है।

उत्तर

3

उपयोग $size ऑपरेटर उपयोगकर्ताओं सरणी में आइटम्स की कुल संख्या प्राप्त करने के लिए:

db.objects.aggregate([ 
    {"$match": {createddate: {$gt : ISODate("2015-07-01T00:00:00.000Z"), $lte : ISODate("2015-07-15T00:00:00.000Z")}} }, 
    {"$match": {object_id: '1'}}, 
    {"$group": { 
     "_id": { 
      "$subtract": [ 
       "$createddate", 
       { "$mod": [ 
        { "$subtract": [ "$createddate", ISODate("1970-01-01T00:00:00.000Z") ] }, 
        1000 * 60 * 60 * 24 
       ]} 
      ] 
     }, 
     "users": { "$addToSet": "$user"}, 
     "totalviews": { "$sum": 1 } 
    }}, 
    { 
     "$project": { 
      "totalviews": 1, 
      "userscount": { "$size": "$users" } 
     } 
    }, 
    { "$sort": { "_id": -1 } } 
]) 
+1

आपको बहुत बहुत धन्यवाद! समाधान काफी सरल है और एक आकर्षण की तरह काम करता है! – aokozlov

+0

क्या आप मुझे सलाह दे सकते हैं कि "उपयोगकर्ताओं" को कैसे बदला जाए: {"$ addToSet": "$ user"}, क्वेरी का हिस्सा अगर मुझे केवल 'कुकी' फ़ील्ड द्वारा विशिष्ट उपयोगकर्ताओं का चयन करने की आवश्यकता है, लेकिन 'id' फ़ील्ड नहीं है? लेकिन 'id' फ़ील्ड को परिणामस्वरूप सेट में भी होना चाहिए। – aokozlov

+0

@aokozlov क्या आप कृपया उन आवश्यकताओं के साथ एक नया प्रश्न बना सकते हैं? लेकिन मूल रूप से समाधान इसे "उपयोगकर्ताओं" में बदलना है: {"$ addToSet": "$ user.cookie"}, ' – chridam

संबंधित मुद्दे