簡體   English   中英

MongoDB:查詢和檢索嵌入式數組中的對象?

[英]MongoDB: Query and retrieve objects inside embedded array?

假設我在名為“users”的集合中有以下文檔架構:

{
    name: 'John',
    items: [ {}, {}, {}, ... ]
}

'items'數組包含以下格式的對象:

{
    item_id: "1234",
    name: "some item"
}

每個用戶可以在“項目”數組中嵌入多個項目。

現在,我希望能夠通過item_id為給定用戶獲取項目。

例如,我想獲取屬於名為“John”的用戶的ID為“1234”的項目。

我可以用mongoDB做到這一點嗎? 我想利用它強大的數組索引,但我不確定你是否可以在嵌入式數組上運行查詢並從數組中返回對象而不是包含它的文檔。

我知道我可以使用{users.items.item_id:“1234”}來獲取擁有某個項目的用戶。 但我想從數組中獲取實際項目,而不是用戶。

或者,是否有更好的方法來組織這些數據,以便我可以輕松地得到我想要的東西? 我仍然是mongodb的新手。

感謝您提供的任何幫助或建議。

問題是陳舊的,但自那時以來,反應已經發生了變化。 使用MongoDB> = 2.2,您可以:

db.users.find( { name: "John"}, { items: { $elemMatch: { item_id: "1234" } } })

你將會有 :

{
   name: "John",
   items: 
   [ 
       {
         item_id: "1234",
         name: "some item"
       }
   ]
}

請參閱$ elemMatch的文檔

關於此,有幾點需要注意:

1)我發現學習MongoDB的人最難的事情是聯合學習他們習慣的關系思維。 您的數據模型看起來是正確的。

2)通常,您使用MongoDB執行的操作是將整個文檔返回到客戶端程序中,然后使用客戶端編程語言在客戶端上搜索所需文檔的一部分。

在您的示例中,您將獲取整個“用戶”文檔,然后遍歷客戶端上的“items []”數組。

3)如果只想返回'items []'數組,可以使用'Field Selection'語法。 有關詳細信息,請參閱http://www.mongodb.org/display/DOCS/Querying#Querying-FieldSelection 不幸的是,它將返回整個'items []'數組,而不僅僅是數組的一個元素。

4)現有的Jira票證可以添加此功能: https: //jira.mongodb.org/browse/SERVER-828 SERVER-828。 看起來它已被添加到最新的2.1(開發)分支中:這意味着它將在2.2版本發布時可用於生產。

如果這是嵌入式數組,則無法直接檢索其元素。 檢索到的文檔將具有用戶(根文檔)的形式,但並非所有字段都可以填充(取決於您的查詢)。

如果只想檢索該元素,則必須將其作為單獨的文檔存儲在單獨的集合中。 它將有一個額外的字段user_id (可以是_id一部分)。 然后做你想做的事是微不足道的。

示例文檔可能如下所示:

{
    _id: {user_id: ObjectId, item_id: "1234"},
    name: "some item"
}

請注意,此結構可確保每個用戶的item_id唯一性(我不確定您是否想要這個)。

暫無
暫無

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

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