如何匹配mongodb中的onther集合数据

时间:2015-10-23 03:04:28

标签: node.js mongodb mongoose

我的名字是Brighton,我是Android开发人员。最近,我一直在研究MongoDB数据库,这对我来说非常困难,需要你的帮助。

FirstCollection

{
    "_id" : ObjectId("5628c5b27ad4a27341f7be6d"),
    "name" : "Ace",
    "address" : "Seuol",
    "reservations" : [ 
        {
            "token" : "f59c6e0a99dabbe2b954bf9fd31bc23e1c07b6079345aa84255ad5e6d457fd523e1387048dd9a31392bfd25dbe6c093386dff31904d20064d7981ef2da4ab11d",
            "productnumber" : 2
        }
    ]
}

SecondCollection

{
    "_id" : ObjectId("561710b47ad4a27341f7be18"),
    "productnumber" : 2,
    "productprice" : "47",
    "category" : "Fix",
    "name" : "Oil"
}

我希望使用productnumber中的FirstCollection中的SecondCollection的值替换{ "_id" : ObjectId("5628c5b27ad4a27341f7be6d"), "name" : "Ace", "address" : "Seuol", "reservations" : [ { "token" : "f59c6e0a99dabbe2b954bf9fd31bc23e1c07b6079345aa84255ad5e6d457fd523e1387048dd9a31392bfd25dbe6c093386dff31904d20064d7981ef2da4ab11d", "productnumber" : { "_id" : ObjectId("561710b47ad4a27341f7be18"), "productnumber" : 2, "productprice" : "47", "category" : "Fix", "name" : "Oil" } } ] } 中仅包含查找查询的实际文档。这是预期的结果

io.emit

如何输入查询?我找不到任何解决方案。当我输入数据时,是否必须输入所有这些数据?

2 个答案:

答案 0 :(得分:0)

在您的架构中

将ref添加到其他集合

"reservations" : [{
        "token" : String,
        "productnumber" : {type:Number, ref:'secendCollection'}
    }]

并使用mongoose populate

schema.find({your query}).populate('reservations.productnumber').exec(callback function)

see the docs

答案 1 :(得分:0)

根据您问题中的标记,您需要对两个集合进行异步调用,因为您希望使用Mongoose获得结果。要理解这个概念,请考虑mongo shell中的操作。

使用mongo Shell中的解决方案,从 find() 方法迭代光标以访问FirstCollection中的文档并使用以下操作reservations数组原生JavaScript方法 map() ,使用SecondCollection上的 findOne() 方法获取新值。像mongo Shell中的以下代码:

var cur = db.reservation.find({"reservations": { "$exists": true, "$type": 4 } });
cur.forEach(function (doc){
    var reservations = doc.reservations.map(function (r){
        var product = db.product.findOne({"productnumber": r.productnumber});
        return { 
            "token": r.token,        
            "productnumber": product
        }
    });
    doc.reservations = reservations;
    printjson(doc);
})

对于给定的样本数据,将打印:

{
    "_id" : ObjectId("5628c5b27ad4a27341f7be6d"),
    "name" : "Ace",
    "address" : "Seuol",
    "reservations" : [
        {
            "token" : "f59c6e0a99dabbe2b954bf9fd31bc23e1c07b6079345aa84255ad5e6d457fd523e1387048dd9a31392bfd25dbe6c093386dff31904d20064d7981ef2da4ab11d",
            "productnumber" : {
                "_id" : ObjectId("561710b47ad4a27341f7be18"),
                "productnumber" : 2,
                "productprice" : "47",
                "category" : "Fix",
                "name" : "Oil"
            }
        }
    ]
}

对于Mongoose中的解决方案,您需要在exec()查询之前调用 lean() 方法,因为文档从启用了精益选项的查询返回的是普通的javascript对象, 因此,您可以使用find()

中的文档替换productnumber字段值来操作文档

来自猫鼬 documentation

SecondCollection

因此,您的代码应该是这样的(假设Model.find().lean().exec(function (err, docs) { docs[0] instanceof mongoose.Document // false }); 模型引用Reservation而产品模型引用FirstCollection):

SecondCollection