mongoose находит, содержит ли массив ссылок на документ IdObject - PullRequest
0 голосов
/ 18 октября 2018

я использую nodejs express и 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 находится в любом массиве ** (друзья, sentRequests или receiveRequests) ** другого пользователя : я использовал этот подход, но Я должен сделать это для 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 голосов
/ 21 октября 2018

Вы можете попробовать выполнить следующий запрос агрегации (если вы используете 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 (который индексируется по умолчанию), поэтому проблем с производительностью не должно быть.

0 голосов
/ 18 октября 2018

Для запроса нескольких полей вы можете использовать пользователя '$ или' .

User.find({
    _id: User1ID,
    {
        $or: [
            {friends: $in:[User2ID]},
            {sentRequests: $in:[User2ID]},
            {receivedRequests: $in:[User2ID]}
        ]
    }
}).then((err, res) => {
    if (res) {
        return ' they are friends';
    }
});

$ или вернуть пользователя, у которого User2ID либо в «друзьях», либо в «sendRequests».'или' receiveRequests '.

Подробнее о ' $ или ' и ' $ in '

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...