我有一個真正的頭痛與貓鼬查詢,我還是相當新的,並想知道如果任何人都可以提出解決方案。
我在圖庫集合中有以下字段。
狀態( '公共' 或 '限制' 的值),
限制( '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),還是有更好的方法來做到與和和或?
你不應該甚至還試圖。基本邏輯不需要**我可以看到的JavaScript。那麼'existsInArray()'應該做什麼?您需要像「慢」(足夠清楚?)一樣不惜一切代價避免JavaScript評估,並且通過使用適當的本地運營商和/或重組數據幾乎總能避免。因此請說明你的魔術功能應該做什麼。我相信我們可以做得更好。 –