使用 nodejs 快速表达和 mongodb 这是我的架构的一部分:
var UserSchema = mongoose.Schema({
friends: [{
type: mongoose.Schema.Types.ObjectId,
ref: "User",
unique: true
}],
sentRequests: [{
type: mongoose.Schema.Types.ObjectId,
ref: "User",
unique: true
}],
receivedRequests: [{
type: mongoose.Schema.Types.ObjectId,
ref: "User",
unique: true
}]
}
var User = mongoose.model('User', UserSchema);
我想查询具有特定 id的用户是否在另一个用户的任何数组**(朋友,sendRequests或ReceivedRequests)**中: 我使用了这种方法,但是我必须对3个数组执行此操作,而且速度很慢:
UserSchema.statics.relStatus = function(User1ID, User2ID) {
var User = this;
User.find({
_id: User1ID,
friends: {
_id: User2ID
}
}).then((err, res) => {
if (res) {
return ' they are friends';
}
});
答案 0 :(得分:0)
您可以尝试以下聚合查询(如果您使用的是mongo 3.4或更高版本):
User.aggregate([
{ $match: { _id: User1ID } },
{
$facet: {
friends: [{ $match: { friends: User2ID } }],
sentRequests: [{ $match: { sentRequests: User2ID } }],
receivedRequests: [{ $match: { receivedRequests: User2ID } }]
}
},
{
$project: {
relationship: {
$switch: {
branches: [
{ case: { $anyElementTrue: [ "$friends" ] }, then: "friends" },
{ case: { $anyElementTrue: [ "$sentRequests" ] }, then: "sentRequests" },
{ case: { $anyElementTrue: [ "$receivedRequests" ] }, then: "receivedRequests" },
],
default: false
}
}
}
}
])
结果将是以下格式的对象{relationship: "<RELATIONSHIP_TYPE>"}
或{relationship: false}
(如果没有关系)。
聚合管道的第一阶段将按_id
匹配单个文档(默认情况下已对其进行索引),因此您不应该遇到任何性能问题。
答案 1 :(得分:-1)
要查询多个字段,您可以使用'$ or'。
User.find({
_id: User1ID,
{
$or: [
{friends: $in:[User2ID]},
{sentRequests: $in:[User2ID]},
{receivedRequests: $in:[User2ID]}
]
}
}).then((err, res) => {
if (res) {
return ' they are friends';
}
});
$ or将返回在“朋友”或“ sentRequests”或“ receivedRequests”中具有User2ID的用户。
希望这会有所帮助。