猫鼬查找文档的引用数组是否包含IdObject

时间:2018-10-17 22:18:32

标签: mongodb express mongoose

使用 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';
        }
    });

2 个答案:

答案 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的用户。

详细了解'$or''$in'

希望这会有所帮助。