我在mongodb中有以下收藏集
db.orders.find()
{ "_id" : ObjectId("5cc69ad493297eade15bacb7"), "item" : "card", "qty" : 15, "user_mob" : 8220097 }
{ "_id" : ObjectId("5cc69adf93297eade15bacb8"), "item" : "card1", "qty" : 11, "user_mob" : 8220097 }
db.items.find()
{ "_id" : ObjectId("5cc69ba493297eade15bacbc"), "item" : "card1", "color" : "blue", "weight" : "50g" }
{ "_id" : ObjectId("5cc69bb793297eade15bacbd"), "item" : "card", "color" : "yellow", "weight" : "60g" }
{ "_id" : ObjectId("5cc69bd193297eade15bacbe"), "item" : "ball", "color" : "multi color", "weight" : "140g" }
{ "_id" : ObjectId("5cc69be793297eade15bacbf"), "item" : "footer", "color" : "Black", "weight" : "340g" }
{ "_id" : ObjectId("5cc69c0c93297eade15bacc0"), "item" : "caps", "color" : "multi color", "weight" : "250g" }
db.users_nippon.find()
{ "_id" : ObjectId("5cadf1d9b0a2d18bdc6de90a"), "name" : "hariharan", "mobile_no" : "8220097", "role_id" : "2", "language_code" : "ml", "encrypted_password" : "password_Passw0rd", "is_salesman" : "true", "is_mobile" : "true" }
然后我在节点js中编写代码以从上述所有表中获取数据。 代码是...
db.collection('users_nippon').aggregate([
{
$lookup: {
from: "orders",
localField: "mobile_no",
foreignField: "user_mob",
as: "orders_data"
}
},
{
$unwind: "$orders_data"
},
{
$lookup: {
from: "items",
localField: "item",
foreignField: "item",
as: "items_data"
}
},
{
$unwind: "$items_data"
}
]).toArray(function(err, list) {
if (err) throw err;
console.log(JSON.stringify(list));
res.send(JSON.stringify(list));
});
出了点问题。它返回空( [] )。
所以,请帮助我解决此问题。
下面的代码是我想要的输出的示例
[
{
"_id": "5cc67e439c26e35a70fddfd5",
"name": "hariharan",
"mobile_no": "8220097",
"role_id": "2",
"language_code": "ml",
"encrypted_password": "password_Passw0rd",
"is_salesman": "true",
"is_mobile": "true",
"orders_data": {
"_id": "5cc6ebe9f4c1d9080b93b013",
"item": "card",
"qty": 15,
"user_mob": "8220097",
"items_data": {
"_id": "5cc69bb793297eade15bacbd",
"item": "card",
"color": "yellow",
"weight": "60g"
}
}
}]
答案 0 :(得分:2)
您的查询中有2个问题:
字段user_mob
(订单模式)是Number
,而mobile_no
(user_nippon模式)是String
,因此无法进行查找。您可能想对这些字段使用相同的类型。
第二个lookup
不正确。前lookup
和unwind
返回item
元素内的orders_data
元素,因此此localField
的{{1}}应更改为:{{ 1}}
因此,在将lookup
和orders_data.item
都更改为具有匹配类型之后,查询将如下所示:
user_mob
答案 1 :(得分:1)
您必须将mobile_no
集合中的users_nippon
的数据类型从string
更改为NumberLong
,否则$lookup
将不起作用。更正它之后,现在您可以使用下面的聚合查询以所需的相同格式获得所需的结果。
db.collection('users_nippon').aggregate([
{
$lookup: {
from: "orders",
localField: "mobile_no",
foreignField: "user_mob",
as: "orders_data"
}
},
{
$unwind: "$orders_data"
},
{
$lookup: {
from: "items",
localField: "orders_data.item",
foreignField: "item",
as: "orders_data.items_data"
}
},
{
$unwind: "$orders_data.items_data"
}
]).toArray(function(err, list) {
if (err) throw err;
console.log(JSON.stringify(list));
res.send(JSON.stringify(list));
});
这是经过测试的有效解决方案。