2015-09-01 72 views
0

我有一個真正的頭痛與貓鼬查詢,我還是相當新的,並想知道如果任何人都可以提出解決方案。

我在圖庫集合中有以下字段。

  • 狀態( '公共' 或 '限制' 的值),

  • 限制( 'canview' 或 'cantview' 的值),

  • canview(用戶ID的數組(ObjectIds)允許查看圖庫)

然後我檢查字段與當前userID,看看哪些項目是可查看的。

如何纔有可能選擇以下所有項目的

a)用「狀態」 =「公共」

b)用「狀態」的所有項目的所有項目=「限制」,其中' 'canview'和'canview'包含用戶ID

我沒有能夠使用$和和$或這樣做,所以試着用$ where來代替。使用下面的全局函數

var existsInArray = function(str,arr) { 
    // nb: remember we have typeof ObjectID, so lets convert to strings first! 
    var newarr = arr.toString().split(','); 
    // now compare.. 
    if(newarr.inArray(str)) { 
     return true; 
    } 
    return false; 
}; 

我希望做這樣的事情......

exports.listviewable = function(req, res) { 

    var reqID = req.user.id; 

    Gallery 
     .find() 
     .$where(function() { 
      return this.status === "public" || (this.status === "restricted" && this.restriction === "canview" && existsInArray(reqID, this.canview)); 
     }) 
     .sort('-created') 
     .exec(function(err, galleries) { 
      if(err) { 
       return res.status(400).send({message:getErrorMessage(err)}) 
      } else { 
       res.json(galleries); 
      } 
     }); 

}; 

但這wasnt工作 - 它似乎我不是能夠使用全球existsInArray功能在$哪裏子句?

是否有可能這樣做(類似的懸而未決的問題在這裏how to call external function in mongoose $where and passing this variable),還是有更好的方法來做到與和和或?

+0

你不應該甚至還試圖。基本邏輯不需要**我可以看到的JavaScript。那麼'existsInArray()'應該做什麼?您需要像「慢」(足夠清楚?)一樣不惜一切代價避免JavaScript評估,並且通過使用適當的本地運營商和/或重組數據幾乎總能避免。因此請說明你的魔術功能應該做什麼。我相信我們可以做得更好。 –

回答

0

A $where函數不能引用您的本地existsInArray函數,因爲$where函數在該本地函數不存在的服務器上執行。

但你不應該使用$where無論如何,你可以用一個簡單的$or查詢需要的事實,你可以直接查詢數組字段像canview有優勢做「載」的行爲:

Gallery 
    .find({ 
     $or: [ 
      {status: 'public'}, 
      {status: 'restricted', restriction: 'cantview', canview: reqId} 
     ] 
    }) 
    .sort('-created') 
    .exec(function(err, galleries) {...}); 
+0

您錯過了'existsInArray()'魔法調用。我想知道OP認爲它爲他們做了什麼。 –

+0

我的閱讀是OP使用該函數來實現canview包含他們正在查找的查詢的UserID邏輯。 – JohnnyHK

+0

足夠公平的猜測。這可能是他們的意思。它是一個簡單的「ID」數組。如果不是,我想會有問題。 –

1

嘿,我會建議打mongo文檔 - 他們有很多關於此的信息。

一)

Gallery.find({status: 'public'}, function(err, data){ 
    console.log(data) 
}); 

B)

Gallery.find({status: 'restricted', restricted: 'canview', canview: reqID }, function(err, data){ 

}); 

或排序兩者一起...

Gallery.find({$or:[ 
    {status: 'public'}, 
    {status: 'restricted', restricted: 'canview', canview: reqID } 
]}, { 
    sort:{created:-1} 
}, function(err, data){ 
    console.log(data) 
});