【发布时间】:2017-05-04 22:39:00
【问题描述】:
我有三个猫鼬模型
当用户喜欢某样东西时,它会保存在 Liked 集合中。但我想做的是。查询 10 个用户以前不喜欢且不是他自己的产品的可用产品。我不知道如何在一个查询中实现这一点。有可能吗?
用户:
{
password: String,
type: {
type: String,
enum: ['user', 'admin'],
required: true,
default: "user"
},
firstName: {type: String},
middleName: {type: String},
lastName: {type: String},
gender: {type: String},
profilePicture: {type: Object},
setOwnProfilePicture: {type: Boolean, default: false},
facebook:{
id: {type: String},
token: {type: String}
}
}
产品:
{
condition: {
type: String,
enum: ['Als nieuw', 'Goed', 'Redelijk', 'Matig'],
required: true,
default: "Goed"
},
type: {
type: String,
enum: ['Ruilen', 'Doneren'],
required: true,
default: "Ruilen"
},
zipCode: {type: String},
houseNumber: {type: String},
distance: {type: Number},
likes: {type: Number, default: 0},
dislikes: {type: Number, default: 0},
title: {type: String},
description: {type: String},
owner: {type: Schema.ObjectId},
images: { type : Array , "default" : [] }
}
喜欢:
{
ownerProductID: {type: Schema.ObjectId},
productID: {type: Schema.ObjectId},
liked: Boolean
}
更新:
我找出要使用的查询,但在结果中我有一个名为 liked 的字段,但我想过滤掉它,所以我的结果中没有任何额外的值。
我现在使用的查询:
db.products.aggregate(
// Pipeline
[
// Stage 1
{
$match: {'owner': {$ne: ObjectId("583f2f33ee975f4e8560b9fe")}}
},
// Stage 2
{
$lookup: {
"from" : "likes",
"localField" : "_id",
"foreignField" : "productID",
"as" : "liked"
}
},
// Stage 3
{
$match: {'liked.ownerProduct': {$nin: [ObjectId("585834609bb1aa1cbe98257b")]}}
},
// Stage 4
{
$limit: 10
},
]
);
【问题讨论】: