如何解决MongoDB - 找出两个集合之间的差异
我有两个集合:
用户
var UserSchema = new mongoose.Schema({
likes: [{ type: mongoose.Schema.Types.ObjectId,ref: 'Products' }],dislikes: [{ type: mongoose.Schema.Types.ObjectId,})
产品
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
看起来很有希望,但我找不到一种方法来设置用户喜欢和不喜欢的联合,然后是所有产品的差异。
解决方法
db.user.aggregate([{
$lookup: {
from: "product",pipeline: [{
$match: {
$or: [{
likes: {
$in: [ < ids or whatever > ]
}
},{
dislikes: {
$in: [ < ids or whatever > ]
}
}]
}
}],as: "nameofthevariable"
}
}])
基本上编写一个查找作为左外连接从产品集合中获取值,其中喜欢是或不喜欢是。在这种情况下,$in 允许您根据要求输入多个值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。