使用mongodb中另一个查询中先前查询的结果

时间:2016-12-24 21:03:10

标签: javascript mongodb

第一次查询:

    db.a.find({
    "type": ObjectId("50ed90f5a70defef23000002"),
    "config.name": "alpha"
 }, {
    "user": 1
 })

第一个查询结果:

{ "_id" : ObjectId("5684035c91b4693b39547591"), "user" : ObjectId("54ba80ac2735eea200623612") }

第2次查询:

   db.users.find({
    "_id": ObjectId("54ba80ac2735eea200623612")
}, {
    "lastname": 1
})

我可以将这两个查询合并到一个查询中吗?第2个查询使用第一个查询结果的"user"ObjectId("54ba80ac2735eea200623612")

2 个答案:

答案 0 :(得分:1)

您可以使用$match与您的条件匹配的聚合,并$lookup将您的本地字段user映射到您的user集合_id字段:

db.a.aggregate(
    [{
        $match: {
            "type": ObjectId("50ed90f5a70defef23000002"),
            "config.name": "alpha"
        }
    }, {
        $lookup: {
            from: "users",
            localField: "user",
            foreignField: "_id",
            as: "users"
        }
    }, {
        $unwind: "$users"
    }]);

在Javascript中,以mongoose为例,您可以执行以下操作:

YourModel.aggregate(
    [{
        $match: {
            "type": ObjectId("50ed90f5a70defef23000002"),
            "config.name": "alpha"
        }
    }, {
        $lookup: {
            from: "users",
            localField: "user",
            foreignField: "_id",
            as: "users"
        }
    }, {
        $unwind: "$users"
    }],
    function(err, result) {
        console.log("lastname : " + result.users.lastname);
    });

答案 1 :(得分:0)

MongoDB doesn't support joins开始,这不能合并到一个查询中。

您可以通过触发第一个查询,将结果存储在变量中然后使用它来触发第二个查询,直接从mongo shell直接执行此操作。

var userDoc = db.a.findOne({"type" : ObjectId("50ed90f5a70defef23000002"),"config.name":"alpha" },{"user":1});
db.users.find({"_id" : userDoc.user},{"lastname":1})

如果您的第一个查询返回多个结果,那么

var cursor = db.a.find({"type" : ObjectId("50ed90f5a70defef23000002"),"config.name":"alpha" },{"user":1});
  cursor.forEach(function (userDoc) {
  var user = db.users.findOne({"_id" : userDoc.user},{"lastname":1});
  printjson(user);
})

注意:MongoDB从版本3.2开始支持left outer join using $lookup in aggregation pipeline

但在这种情况下,这似乎是一种矫枉过正。