MongoDB $lookup 返回空数组[重复]
Posted
技术标签:
【中文标题】MongoDB $lookup 返回空数组[重复]【英文标题】:MongoDB $lookup returns empty array [duplicate] 【发布时间】:2017-11-01 09:02:45 【问题描述】:当我尝试在 mongo db 中加入时,$lookup 返回空数组。
我有两个集合,一个是 user_information,另一个是 add_to_cart。我想使用 user_information 中的 user_id 获取用户表单 add_to_cart 集合的 add_to_cart 详细信息。
add_to_cart 收藏:
[
"_id":
"$id": "592ec12b744a12d014000031"
,
"order_id": "592ec125744a12d014000030",
"table_id": 1,
"category_name": "veg",
"food_id": "5923c8bc744a12441e000031",
"user_id": "592ec125744a12d01400002f",
"food_name": "Cream Of Mushroom Soup",
"food_per_price": "100",
"food_total_price": 100,
"food_qty": 1,
"active_status": 0,
"created_at":
"sec": 1496236331,
"usec": 0
,
"updated_at":
"sec": 1496236331,
"usec": 0
,
"_id":
"$id": "592ec12e744a12d014000032"
,
"order_id": "592ec125744a12d014000030",
"table_id": 1,
"category_name": "veg",
"food_id": "5923c8cb744a12441e000033",
"user_id": "592ec125744a12d01400002f",
"food_name": "Cream Of Mushroom Soup",
"food_per_price": "100",
"food_total_price": 100,
"food_qty": 1,
"active_status": 0,
"created_at":
"sec": 1496236334,
"usec": 0
,
"updated_at":
"sec": 1496236334,
"usec": 0
]
用户信息收集:
[
"_id":
"$id": "592ec125744a12d01400002f"
,
"branch_id": 1,
"brand_id": 1,
"business_id": 1,
"table_id": 1,
"uid": "116907438816775509716",
"user_name": "dhamo dharan",
"user_email": "dhamursv@gmail.com",
"user_provider": "google",
"user_image": "https://lh5.googleusercontent.com/-Masl6FTlG_g/AAAAAAAAAAI/AAAAAAAAAEo/UV3oTjMnqzQ/s96-c/photo.jpg",
"active_status": 0,
"created_at":
"sec": 1496236325,
"usec": 0
,
"updated_at":
"sec": 1496236325,
"usec": 0
]
我的数据库查询
db.add_to_cart.aggregate([
"$match": "user_id": "592ec125744a12d01400002f" ,
"$sort": "created_at": -1 ,
"$limit": 20 ,
"$lookup":
"from": "user_information",
"localField": "user_id",
"foreignField": "_id",
"as": "userinfo"
,
"$unwind": "$userinfo" ,
"$project":
"food_name": 1,
"food_qty": 1,
"userinfo.user_name": 1,
"userinfo.user_email": 1
])
它会返回空结果,我不知道出了什么问题。提前谢谢!
【问题讨论】:
因为"user_id": "592ec125744a12d01400002f"
是一个“字符串”而"_id": "$id": "592ec125744a12d01400002f"
实际上是一个ObjectId
,尽管它以Java 驱动程序在控制台中的方式进行序列化,输出。这两种类型不匹配。根本原因是 "user_id"
应该被存储为 ObjectId
,但是您的应用程序代码做错了。
感谢它在将 id 更改为对象后现在可以工作了!
如果有任何方法可以在查询本身中将 id 转换为 objectId
没有。您不能在聚合管道中“强制转换类型”。
我接受,谢谢!
【参考方案1】:
简单来说 - 你的匹配查询是错误的。
因为 "user_id": "592ec125744a12d01400002f" 是一个 "string" ,所以匹配使用字符串 ObjectId 的普通查找查询可以正常工作
但是当我们谈论聚合时,你不能直接给出字符串..你总是给出 mongoose.Types.ObjectId(userId) ,其中 userId 是字符串
var userId="592ec125744a12d01400002f";
db.add_to_cart.aggregate([
"$match": "user_id": mongoose.Types.ObjectId(userId) ,
"$sort": "created_at": -1 ,
"$limit": 20 ,
"$lookup":
"from": "user_information",
"localField": "user_id",
"foreignField": "_id",
"as": "userinfo"
,
"$unwind": "$userinfo" ,
"$project":
"food_name": 1,
"food_qty": 1,
"userinfo.user_name": 1,
"userinfo.user_email": 1
])
【讨论】:
以上是关于MongoDB $lookup 返回空数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB $lookup 和 $group 返回空数组
MongoDB Lookup 返回一个空数组,只有在没有数据的时候