Мангуст находит значение из другой коллекции

вот мои модели:

var RaceSchema = new mongoose.Schema({
    name: {
        type: String
    },
    owner:{
        type: mongoose.Schema.ObjectId, ref:"user"
    }
});
var UserSchema = new mongoose.Schema({
    username: { 
        type: String
    }
});

Вот пример моих коллекций:

//Races
{
    "_id": {
        "$oid": "5b5740c54befec2594ce4cb0"
    },
    "name": "Race1"
    "owner": {
        "$oid": "5b34f870e1eef640f8cb43e4"
    }
}
//User
{
    "_id": {
        "$oid": "5b34f870e1eef640f8cb43e4"
    },
    "username":"admin"
}

Я хочу найти расы, владелец которых совпадает с полем username. Я имею в виду: я хочу найти расы, владельцем которых является администратор.

Я пытаюсь это с:

Race.find().populate('users', {username: 'admin'}).exec(function (err, races) {
    ....
}

Но всегда результат один, поиск выдает все расы.

ИЗМЕНИТЬ 1

Предложение SQL будет:

Select * FROM Races,Users WHERE owner=user._id AND user.username='admin' 

Или что-то типа того


person ipakto    schedule 24.07.2018    source источник
comment
Как насчет использования свойства find и указания того, что вы действительно хотите найти?   -  person Capricorn    schedule 24.07.2018


Ответы (3)


Чтобы получить данные из двух разных коллекций, вам нужно будет использовать функцию aggregate с $lookup (см. документы)

Вы можете найти его эквивалент в мангусте (см. этот вопрос)

person nmxl    schedule 24.07.2018
comment
Я не хочу получать данные из двух разных коллекций. Предложение SQL будет таким: Выберите * FROM Races,Users WHERE owner=user._id AND user.username='admin' Или что-то в этом роде - person ipakto; 24.07.2018

Наконец я это сделал. РЕШЕНИЕ:

Вот мой код:

var query=[{
        "$lookup": {
            "from": "users",
            "localField": "owner",
            "foreignField": "_id",
            "as": "user"
        }
    },{
        "$unwind": "$user"
    },{
        "$match": {
            "$and": [{
                "user.username": username
            }]
        }
    }];
Race.aggregate(query, function (err, races){
    ....
}
person ipakto    schedule 25.07.2018

как только вы получите все расы, используйте фильтр метода массива

пример:

let adminRaces = races.filter(x=>x.owner['$oid'] === admin._id['$oid'])

вот ссылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

person Michal Varyš    schedule 24.07.2018