簡體   English   中英

Mongoose DBRef的實現與MongoDB文檔中的不同

[英]Mongoose DBRef implementation is not the same like in MongoDB documentation

我有一個小問題,也許是個小問題。 我正在嘗試對MongoDB數據庫使用mongoose.js的reference 讓我們看一下這個例子:

示例代碼:

https://gist.github.com/hastebrot/1170907

當我運行此代碼時,我的數據庫中有類似的內容:

> db.stories.find()
{ 
  "title" : "A man who cooked Nintendo",
  "_creator" :  ObjectId("52e7dc001bdedb703df29b8e"),
  "_id" : ObjectId("52e7dc001bdedb703df29b8f"),
  "fans" : [ ], "__v" : 0
}

> db.people.find()
{
  "name" : "Aaron",
  "age" : 100,
  "_id" : ObjectId("52e7dc001bdedb703df29b8e"),
  "stories" : [ ], "__v" : 0
}

問題出在哪兒?

如果我使用貓鼬插入數據並使用貓鼬讀取引用,一切都很好。 但是,當Java程序通過具有自己的mongoDB層的數據庫獲取db時,就會出現問題。

此Java程序在db中添加了類似的內容(這是另一個示例,不要在不匹配的字段上查找):

//other fields
"user": {
    "$ref": "users",
    "$id": {
        "$oid": "52c6c497c08e6fcf37000001"
    }
}

當我們轉到MongoDB的文檔( http://docs.mongodb.org/manual/reference/database-references/#dbrefs )時,我們可以看到引用屬性需要$ref$id字段。

題:

那么將mongoDB的DBRef類型錯誤實現為貓鼬是問題還是我做錯了嗎?

貓鼬中的參考是手動參考,不是dbref (我將在后面討論其用法)。 從高層次_creator ,這是將人的ObjectId作為值嵌入_creator字段中。 然后,如果您希望“使用”這種關系,例如通過查找由“亞倫”這個人創建的所有故事,那么實際上會有兩個查詢:

  • 第一個查詢將從人集合中獲取人名Aaron的_id ,即: db.people.findOne({"name" : "Aaron"})
  • 第二個查詢將使用_id查找與該創建者相關的所有故事,即: db.stories.find({"creator" : ObjectId("52e7dc001bdedb703df29b8e")})

ORM (在這種情況下為貓鼬)正在為您抽象化,並允許您定義關系等,而您無需了解幕后情況。

當您嘗試使用ORM以外的本機驅動程序執行此操作時,就其實際上如何實現這些關系而言,您犯了一個根本性的錯誤。 它不使用數據庫引用,並且通常不鼓勵使用它們(請參閱docs中有關手動引用的第一條注釋),而是使用與上文所述類似的內容。

如果要模擬功能,則應執行類似的操作,並避免使用數據庫引用。

暫無
暫無

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

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