当我的mongo数组只保存了id时,我已成功在我的节点webservice中使用$ in。这是样本数据。
{
"_id": {
"$oid": "52b1a60ce4b0f819260bc6e5"
},
"title": "Sample",
"team": [
{
"$oid": "52995b263e20c94167000001"
},
{
"$oid": "529bfa36c81735b802000001"
}
],
"tasks": [
{
"task": {
"$oid": "52af197ae4b07526a3ee6017"
},
"status": 0
},
{
"task": {
"$oid": "52af197ae4b07526a3ee6017"
},
"status": 1
}
]
}
请注意,任务是一个数组,但是id嵌套在“task”中,而在团队中它是顶层的。这是我的问题所在。
在我的Node路由中,这就是我通常在项目中调用ID数组的方法,这在团队示例中运行良好,但显然不适用于我的任务示例。
app.get('/api/tasks/project/:id', function (req, res) {
var the_id = req.params.id;
var query = req.params.query;
models.Projects.findById(the_id, null, function (data) {
models.Tasks.findAllByIds({
ids: data._doc.tasks,
query: query
}, function(items) {
console.log(items);
res.send(items);
});
});
});
与我的模型进行通信,该模型有一个名为findAllByIds
的方法module.exports = function (config, mongoose) {
var _TasksSchema = new mongoose.Schema({});
var _Tasks = mongoose.model('tasks', _TasksSchema);
/*****************
* Public API
*****************/
return {
Tasks: _Tasks,
findAllByIds: function(data, callback){
var query = data.query;
_Tasks.find({_id: { $in: data.ids} }, query, function(err, doc){
callback(doc);
});
}
}
}
在此次通话中,我有 $ in:data.ids ,它在简单数组中工作,就像上面的“团队”示例一样。一旦我嵌套我的对象,就像“任务”示例一样,这不再起作用了,我不知道如何指定$ in来查看data.ids数组,但是使用“task”值。
我想避免迭代数据来创建只有id的数组,然后在返回数据后重新填充其他值,除非这是唯一的选择。
更新
我想过设置这样的mongo文档,虽然我仍然想知道如何以其他方式做到这一点,如果将来不可能的话。
"tasks": {
"status0": [
{
"$oid": "52995b263e20c94167000001"
},
{
"$oid": "529bfa36c81735b802000001"
}
],
"status1": [
{
"$oid": "52995b263e20c94167000001"
},
{
"$oid": "529bfa36c81735b802000001"
}
]
}
答案 0 :(得分:0)
您是否在查找条件中尝试$ elemMatch选项? http://docs.mongodb.org/manual/reference/operator/query/elemMatch/
答案 1 :(得分:0)
您可以在map
数组上调用tasks
将其投影到只包含ObjectId
值的新数组中:
models.Tasks.findAllByIds({
ids: data.tasks.map(function(value) { return value.task; }),
query: query
}, function(items) { ...