2016-01-05 55 views
2

我有與蒙戈集合中的出生日期的文件列表。我們有前端,其中用戶可以將數據添加複雜的條件下能獲得像如何獲得用戶列表誰是今天的生日是在MongoDB中

(user.dob isToday AND user.score > 1000) OR (user.dob isTomorrow AND user.score > 2000) 

除了日期類型的結果,我能夠在上述條件下轉化爲相應的蒙戈查詢像{"score" : { $gt: 1000}}

在生日條件的情況下,我們只有通過使用聚合,不會對我的上述使用情況下幫助查詢數據庫與在蒙戈支持一年的月份和月份的一天。

任何人都有建議嗎?想法?

回答

1

MongoDB的3.6和更大,讓誰今天有一個生日的所有用戶的列表,請使用$expr運營商允許查詢語言中使用聚合表達式:

db.users.find({ 
    "$expr": { 
     "$and": [ 
      { "$eq": [ { "$dayOfMonth": "$dob" }, { "$dayOfMonth": new Date() } ] }, 
      { "$eq": [ { "$month"  : "$dob" }, { "$month"  : new Date() } ] } 
     ] 
    } 
}); 

對於其他MongoDB版本,您需要運行一個使用流水線的集合操作,以便藉助$cond操作員進行編輯。考慮執行以下管道:

db.users.aggregate([ 
    { 
     "$redact": { 
      "$cond": [ 
       "$and": [ 
        { "$eq": [ { "$dayOfMonth": "$dob" }, { "$dayOfMonth": new Date() } ] }, 
        { "$eq": [ { "$month"  : "$dob" }, { "$month"  : new Date() } ] } 
       ] 
      ], 
      "$$KEEP", 
      "$$PRUNE" 
     } 
    } 
]); 

$cond表達上述

"$cond": [ 
    "$and": [ 
     { "$eq": [ { "$dayOfMonth": "$dob" }, { "$dayOfMonth": new Date() } ] }, 
     { "$eq": [ { "$month"  : "$dob" }, { "$month"  : new Date() } ] } 
    ] 
], 

實質上代表所述條件語句

if (dob.getDate() === day && dob.getMonth === month) { 
    "$$KEEP" // keep the document in the pipeline 
} else { 
    "$$PRUNE" // prune/discard the document from the output 
} 

$redact管道將返回匹配(基於$month$dayOfMonthdate operators通過$cond返回系統變量)與$$KEEP條件的所有文件,並與$$PRUNE否則丟棄的文件。

+1

感謝您的答覆。上述解決方案將只提取出生在特定年份的用戶。例如:2016年1月6日。但是我希望所有的生日不到1月6日的用戶發送生日祝福。 –

+0

當時誤解了你的問題,但現在我想上面的編輯會解決這個問題,請檢查。 – chridam

1

您可以使用聚合框架與$dayOfYear運營商。我假定出生當天被存儲在現場birthday,並且有一個名爲name場:

db.data.aggregate(
[ 
     { 
       "$project" : { 
         "_id" : 0, 
         "name" : 1, 
         "birthday" : 1, 
         "score" : 1, 
         "todayDayOfYear" : { 
           "$dayOfYear" : new Date() 
         }, 
         "birthDayOfYear" : { 
           "$dayOfYear" : "$birthday" 
         } 
       } 
     }, 
     { 
       "$project" : { 
         "name" : 1, 
         "birthday" : 1, 
         "score" : 1, 
         "isBirthDay" : { 
           "$eq" : [ 
             "$todayDayOfYear", 
             "$birthDayOfYear" 
           ] 
         } 
       } 
     }, 
     { 
       "$match" : { 
         "isBirthDay" : true, 
         "score" : { $gt: 100} 
       } 
     } 
] 
) 
0

Nice solution, taken from here

const User = require('user'); 
const day = (new Date()).getDate(); 
const month = (new Date()).getMonth(); 

const users = await User.find({ 
    $where:`return this.birthday.getDate() === ${day} && this.birthday.getMonth() === ${month}` 
}).exec(); 
相關問題