簡體   English   中英

在mongoDB中執行文本搜索,並為集合中的每個項目查找參考文檔

[英]Perform a text search in mongoDB and find reference document for each item in the collection

我正在尋找一種搜索旅行集合的方法。 搜索將檢查行程是否包含傳遞的城市名稱(從和到位置)。 每個行程模型都有創建條目的用戶的ID。 該查詢可能會返回集合中的0或100個項目。 我需要在搜索結果中顯示有關用戶的數據。 對我而言,搜索行程信息並獲取用戶信息的最佳方法是什么?

結果中的每個行程可能有不同的用戶。

我曾考慮過將用戶信息嵌入旅行模型中,但是隨后我必須制定一種策略,以便在每次用戶信息更改時都更新信息。 到用戶(創建者)關系的旅程將始終是一對一的。 目前,我僅嵌入用戶ID。 當我一次查詢一次旅行,但不適用於搜索時,此方法很好用。

當前查詢:在文本中尋找匹配項

module.exports = function(app) {
    app.get('/search', function(req, res) {
    var search = req.query;
    var query = {};

    if(search.origin) {
        query.origin = {
            $regex: search.origin,
            $options: 'i',
        };
    }

    if(search.destination) {
        query.destination = {
            $regex: search.destination,
            $options: 'i',
        };
    }

    Trip.find(query, function(err, trips) {
        if(err) return res.json( err );

        return res.json(trips);            
    });
});

旅行模式:

var TripSchema = mongoose.Schema({
    user: {
        type: Schema.Types.ObjectId,
        required: true
    },
    origin: {
        type: String,
        required: true
    },
    destination: {
        type: String,
        required: true
    },
    departing: {
        type: Date,
        required: true
    },
    returning: {
        type: Date
    },
});

用戶模型:

var UserSchema = mongoose.Schema({
    name: {
        type: String
    },
    username: {
        type: String
    },
    password: {
        type: String,
    }

});

我不確定自己是否做對了,但最終還是做了這樣的事情。 首先,我根據搜索字符串從數據庫獲取行程。 搜索基於旅行的出發地和目的地。 獲得旅行清單后,我將遍歷數組並獲取每個用戶的ID並將其推入另一個數組。 我使用該數組,並使用db.model.find()方法和$in運算符從數組中查找用戶。

因為我需要每次旅行都具有一個用戶對象,所以我要在旅行中重復一次,然后將用戶obj分配給旅行。

由於對象貓鼬返回的類型,我不得不進行一些到JSON的轉換。 我不能只分配一個新屬性。 我使用toJSON()方法將其轉換為JSON。

如果有人知道更好的方法或對如何改進以下代碼有任何想法,歡迎任何建設性的反饋。

app.get('/search', function(req, res) {
    if(!req.query.origin || !req.query.destination){
        return res.json({trips: []});
    }

    var search = req.query;
    var query = {};

    if(search.origin) {
        query.origin = {
            $regex: search.origin,
            $options: 'i',
        };
    }

    if(search.destination) {
        query.destination = {
            $regex: search.destination,
            $options: 'i',
        };
    }

    Trip.find(query, function(err, trips) {
        if(err) return res.json(err);

        var userIds = [];

        //get user ids from trip
        trips.forEach(function(trip) {
            userIds.push(mongoose.Types.ObjectId(trip.user));
        });

        var user = User.find({
            '_id': { $in: userIds}
        });

        user.select('id name');
        user.exec(function (err, users) {
            if (err) return res.json(err);

            var jsonTrips = [];
            var currentTrip;

            trips.forEach(function(trip) {
                currentTrip = trip.toJSON();
                currentTrip.user = findTripUser(trip.user, users);
                jsonTrips.push(currentTrip);
            });

            return res.json(jsonTrips);  
        });   
    });
});

function findTripUser(tripId, users) {
    var user;
    for(var i = 0; i < users.length; i++) {
        if(JSON.stringify(users[i]._id)=== JSON.stringify(tripId)) {
            user = users[i];
            break;
        } 
    }

    return user.toJSON();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM