[英]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.