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 返回空数组

MongoDB:$lookup 返回空数组

MongoDB $lookup 和 $group 返回空数组

MongoDB Lookup 返回一个空数组,只有在没有数据的时候

MongoDB Lookup 返回一个空数组,只有在没有数据的时候

Mongodb.find返回空数组[重复]