在MongoDb上向后搜索

时间:2015-01-09 18:13:56

标签: mongodb nosql

我有2个收藏。

收集“用户”

{
        "_id" : ObjectId("54b00098e0fdb6634b1f54e6"),
        "state" : "active",
        "backends" : [
                DBRef("backends", ObjectId("54b001ebe0fd853df1c93419")),
                DBRef("backends", ObjectId("54b00284e0fd853df1c9341b"))
        ]
}

收集“后端”

{
        "_id" : ObjectId("54b001ebe0fd853df1c93419"),
        "state" : "running"
}

我想获得后端状态为“正在运行”的用户后端列表。 mongodb怎么能这样加入两个表呢? 是从后端向后搜索还是对过滤器起作用的任何方法?

我可以像这样搜索

db.users.find({"backends.$id" : "distring"})

但是如果我想在后端对象中搜索状态怎么办?等。

db.users.find({"backends.$state" : "running"})

但是它没有用。

1 个答案:

答案 0 :(得分:0)

MongoDB不支持联接,因此您需要分两步完成此操作。在shell中:

var ids = db.backends.find({state: 'running'}, {_id: 1}).map(function(backend) {
    return backend._id;
});

var users = db.users.find({'backends.$id': {$in: ids}}).toArray();

另外,对于ObjectId数组元素,您可能最好使用普通DBRef代替backends,除非该数组中的ID实际可以引用多个馆藏的文档。