2014-02-20 203 views
0

我有以下型號貓鼬查詢子文檔或空

var schema = new Schema({ 
    type: String, 
    accounts: [{ type: ObjectId, ref: "Account", index: 1 }], 
    accountTypes: [String], 
    headline: String, 
    contents: String, 
    date: { type: Date, "default": Date.now } 
}); 

我需要一個查詢,其基於一個帳號,讓我滿足其中之一,所有文檔。

  • accounts.length === 0 && accountTypes.length === 0
  • accounts.length === 0 && accountTypes.indexOf(account.type) !== -1
  • accounts.indexOf(account.type) !== -1 && accountTypes.length === 0

什麼是在儘可能少的步驟可以執行此查詢的最佳方法是什麼?我可以在單個查詢中執行此操作嗎?怎麼樣?

我知道我可以將這些查詢放在彼此的頂部,但它並不感覺非常高效。

這是我到目前爲止,但我不知道它是否會工作。

Notification.find({ 
    $or: [ 
     { $and: [{ $where: "this.accounts.length === 0" }, { $where: "this.accountTypes.length === 0" }] }, 
     { $and: [{ $where: "this.accounts.length === 0" }, { accountTypes: account.type }] }, 
     { $and: [{ $where: "this.accountTypes.length === 0" }, { accounts: account._id }] } 
    ] 
}, function (err, notifications) { 
    // stuff 
}); 

回答

4

試試這個:

Notification.find({ 
    $or: [ 
     { $and: [{ accounts: { $size: 0 }, { accountTypes: {$size: 0 }] }, 
     { $and: [{ accounts: { $size: 0 }, { accountTypes: account.type }] }, 
     { $and: [{ accountTypes: { $size: 0 }, { accounts: account._id }] } 
    ] 
}, function (err, notifications) { 
    // stuff 
}); 

編輯:

甚至更​​短(感謝JohnnyHK的提示)

Notification.find({ 
    $or: [ 
     { accounts: { $size: 0 }, accountTypes: { $size: 0 } }, 
     { accounts: { $size: 0 }, accountTypes: account.type }, 
     { accountTypes: { $size: 0 }, accounts: account._id } 
    ] 
}, function (err, notifications) { 
    // stuff 
}); 
+0

我想你可以通過進一步簡化該消除'$和's,並將每個'$和'數組元素組合成一個對象。 – JohnnyHK