我的名字是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
如何输入查询?我找不到任何解决方案。当我输入数据时,是否必须输入所有这些数据?
答案 0 :(得分:0)
将ref添加到其他集合
"reservations" : [{
"token" : String,
"productnumber" : {type:Number, ref:'secendCollection'}
}]
并使用mongoose populate
schema.find({your query}).populate('reservations.productnumber').exec(callback function)
答案 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