在MongooseJS中使用带有嵌套对象的$ in

时间:2014-03-11 07:09:37

标签: node.js mongodb mongoose

当我的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"
            }
        ]
        }

2 个答案:

答案 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) { ...