//Employee Documents
/* 1 */
{
"_id" : ObjectId("5c41aaa91d0b034e617effc0"),
"emp_id" : 1
}
/* 2 */
{
"_id" : ObjectId("5c41aaec1d0b034e617f0001"),
"emp_id" : 2
}
/* 3 */
{
"_id" : ObjectId("5c41aaf31d0b034e617f0009"),
"emp_id" : 3
}
//Salary Documents:
{
"_id" : ObjectId("5c41aac01d0b034e617effd4"),
"emp_id" : 1,
"salary" : 1000
}
**//Query**
db.employee.aggregate([
{
$lookup:{
from: "salary",
localField: "emp_id", //reference of employee collection
foreignField: "emp_id", //reference of salary collection
as: "sal"
}
},{
$unwind: {
path: "$sal",
preserveNullAndEmptyArrays: true //will return null if salary does not exist
}
},{
$project:{
emp_id: 1,
salary: { $ifNull: [ "$sal.salary", 0 ] } //will set to 0 if salary does not exist
}
}]);
//Output
/* 1 */
{
"_id" : ObjectId("5c41aaa91d0b034e617effc0"),
"emp_id" : 1,
"salary" : 1000
}
/* 2 */
{
"_id" : ObjectId("5c41aaec1d0b034e617f0001"),
"emp_id" : 2,
"salary" : 0.0
}
/* 3 */
{
"_id" : ObjectId("5c41aaf31d0b034e617f0009"),
"emp_id" : 3,
"salary" : 0.0
}
Самый простой способ связать вызов с handle_click
к объекту это определяется в, было бы что-то вроде этого:
var self=this;
document.getElementById('x').onclick =
function(e) { return self.handle_click(e) };
Если необходимо передать в параметрах или хотеть заставить код выглядеть более чистым (например, при установке большого количества подобных обработчиков событий) Вы могли бы использовать приправляющую карри технику для достижения того же:
bind : function(fn)
{
var self = this;
// copy arguments into local array
var args = Array.prototype.slice.call(arguments, 0);
// returned function replaces first argument with event arg,
// calls fn with composite arguments
return function(e) { args[0] = e; return fn.apply(self, args); };
},
...
document.getElementById('x').onclick = this.bind(this.handle_click,
"this parameter is passed to handle_click()",
"as is this one");
Так, часть обработчика событий обеспечивает электричеством очень хорошо (я протестировал ее сам), но, как Ваш комментарий указывает, у Вас нет доступа к "y" свойству объекта, который Вы просто определили.
Это работает:
var object = {
y : 1,
handle_click : function (e) {
alert('handling click');
//want to access y here
alert(this.y);
return false;
},
load : function () {
var that = this;
document.getElementById('x').onclick = function(e) {
that.handle_click(e); // pass-through the event object
};
}
};
object.load();
Существуют другие способы сделать это также, но это работает.
Я вижу, как сделать это с последним Jason. Какой-либо способ сделать это без анонимной функции?