[英]MongoDB - Query conundrum - Document refs or subdocument
我將某些數據存儲在MongoDB中時遇到了一個問題(注意:我將Mongoose用作ODM)。 我有兩種模式:
mongoose.model('Buyer',{
credit: Number,
})
和
mongoose.model('Item',{
bid: Number,
location: { type: [Number], index: '2d' }
})
買方/物品將具有一對多的父子關系。 我知道我可以設置的項目將被嵌入SUBDOCS給買方的文件或我可以創建對象ID引用對方兩個單獨的文件。
我面臨的問題是,我需要查詢其出價低於買方信用額度但位置接近某個地理坐標的項目 。
為了滿足第一個條件,看來我應該將Items嵌入為子文檔,以便可以比較兩個數字。 但是,為了將地理位置與geoNear查詢進行比較,似乎最好將文檔分開,否則,我無法在每個子文檔上執行geoNear。
有什么辦法可以對這些數據執行兩項任務? 如果是這樣,我應該如何構造我的數據? 如果沒有,是否可以對第一個查詢的結果執行一個查詢,然后執行第二個查詢?
謝謝你的幫助!
還有另一個選項(除了嵌入和規范化之外),用於將層次結構存儲在mongodb中,即將它們存儲為樹結構 。 在這種情況下,您可以將買家和商品存儲在單獨的文檔中,但存儲在同一集合中。 每個項目文檔都需要一個指向其買方(父)文檔的字段,並且每個買方文檔的父字段將設置為null。 我鏈接的文檔解釋了幾種可以選擇的實現。
如果您的項目存儲在兩個單獨的集合中,則最好的選擇是編寫您自己的函數,並使用mongoose.connection.db.eval('some code...');
調用mongoose.connection.db.eval('some code...');
。 在這種情況下,您可以在服務器端執行高級邏輯。
您可以這樣寫:
var allNearItems = db.Items.find(
{ location: {
$near: {
$geometry: {
type: "Point" ,
coordinates: [ <longitude> , <latitude> ]
},
$maxDistance: 100
}
}
});
var res = [];
allNearItems.forEach(function(item){
var buyer = db.Buyers.find({ id: item.buyerId })[0];
if (!buyer) continue;
if (item.bid < buyer.credit) {
res.push(item.id);
}
});
return res;
經過評估(將其放在mongoose.connection.db.eval("...")
調用中),您將獲得項目ID的數組。
請謹慎使用。 如果allNearItems數組太大,或者經常查詢它,則可能會遇到性能問題。 MongoDB團隊實際上已經棄用了直接執行js代碼,但在當前的穩定版本中仍然可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.