簡體   English   中英

MongoDB-查詢難題-文檔引用或子文檔

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

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