MongoDB - 查找两个集合之间的差异

Posted

技术标签:

【中文标题】MongoDB - 查找两个集合之间的差异【英文标题】:MongoDB - Find Difference Between Two Collections 【发布时间】:2021-07-25 12:27:40 【问题描述】:

我有两个收藏:

用户

var UserSchema = new mongoose.Schema(
    likes: [ type: mongoose.Schema.Types.ObjectId, ref: 'Products' ],
    dislikes: [ type: mongoose.Schema.Types.ObjectId, ref: 'Products' ],
)

产品

var ProductSchema = new mongoose.Schema(
  title: 
    type: String,
    required: true,
  ,
)

我想退回所有不在 User.likes 或 User.dislikes 中的产品。以下是我目前的做法:

const user = await User.findById(req.user.id, 'likes dislikes');
let seenProducts = [];

user.likes.forEach(p => 
    seenProducts.push(new mongoose.Types.ObjectId(p));
)

user.dislikes.forEach(p=> 
    seenProducts.push(new mongoose.Types.ObjectId(p));
)

Product.aggregate([
    
        $match:  _id:  $nin: seenProducts  ,
    
])

它有效,但如果可能,我想切换到使用聚合管道框架来执行此操作。比较两个系列似乎并不容易......我已经尝试了一段时间但没有运气。 $setUnion$setDifference 看起来很有希望,但我找不到一种方法来设置用户好恶的联合,然后是所有产品的差异。

【问题讨论】:

【参考方案1】:
db.user.aggregate([
  $lookup: 
    from: "product",
    pipeline: [
      $match: 
        $or: [
          likes: 
            $in: [ < ids or whatever > ]
          
        , 
          dislikes: 
            $in: [ < ids or whatever > ]
          
        ]
      
    ],
    as: "nameofthevariable"
  
])

基本上编写一个查找作为左外连接从产品集合中获取喜欢或不喜欢的值。在这种情况下,$in 允许您根据需要输入多个值。

【讨论】:

以上是关于MongoDB - 查找两个集合之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

mongoDB中提到的两个查询之间的差异

MongoDB Pymongo 问题

如何将一个集合分成两个子集,以使两个集合中数字之和之间的差异最小?

如何使用javascript查找两个日期之间的天数差异

PHP查找两个日期时间之间的差异

查找两个日期之间的差异 Oracle SQL