我有两个集合:
用户
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
看起来很有希望,但我找不到一种方法来设置赞和赞的联合;用户的不喜欢,然后与所有产品的差异。
db.user.aggregate([{
$lookup: {
from: "product",
pipeline: [{
$match: {
$or: [{
likes: {
$in: [ < ids or whatever > ]
}
}, {
dislikes: {
$in: [ < ids or whatever > ]
}
}]
}
}],
as: "nameofthevariable"
}
}])
基本上是编写一个查找,它充当左外部联接,从喜欢或不喜欢的产品集合中获取值$在这种情况下,in允许您根据需要输入多个值。