2014-01-17 5 views
1

У меня есть две таблицы структуры в MongoDB:запроса другой атрибут в MongoDB с DBRef

> db.mapping.find()

{ "_id" : ObjectId("52d74f4941538c0b386090af"), 
    "tc" : DBRef("fttc", ObjectId("52d74f4841538c0b3860902e")), 
    "hit" : { "24" : 1, "25" : 1, "26" : 1, "27" : 2}} 
... 

> db.fttc.find()

{ "_id" : ObjectId("52d74f4841538c0b38609041"), 
    "full" : "build1111_tastcase_20", 
    "tags" : [ "tag_0" ] } 
... 

> db.mapping.find() [0] .tc.fetch(). полный

build1111_tastcase_1 

> db.mapping.find ({ 'дц $ ID.': ObjectId ("52d74f4841538c0b3860902e")})

{ "_id" : ObjectId("52d74f4941538c0b386090a0"), 
    "tc" : DBRef("fttc", ObjectId("52d74f4841538c0b3860902e")), 
    "hit" : { "24" : 3, "25" : 3 } } 
... 

Теперь я могу получить те элементы, ТК атрибут 'id 'является ObjectId("52d74f4841538c0b3860902e").

Но, как я могу найти все элементов из отображения, чей атрибут ОК «полных» есть "build1111_tastcase_20?

Есть ли запрос?

Любая помощь или предложения будут высоко оценены!

ответ

1

Фактически вы запрашиваете соединение, которое не поддерживается на стороне сервера в MongoDB (по дизайну).

Учитывая, что в вашей коллекции mapping имеется только DBref, указывающий на коллекцию fttc, вам придется решить эту проблему, используя несколько запросов и присоединяя результаты в своем приложении. Это займет три запроса на стороне сервера: один, чтобы найти документ mapping, один для поиска соответствующего документа fttc, а затем, наконец, поиск по fttc для сопоставления документов с тем же атрибутом full.

Лучшим способом приблизиться к этому в MongoDB было бы денормализовать атрибут full, который вы хотите запросить, поэтому он заканчивается сохранением в обеих коллекциях.

Ваше отображение документа будет выглядеть:

{ "_id" : ObjectId("52d74f4941538c0b386090a0"), 
    "tc" : DBRef("fttc", ObjectId("52d74f4841538c0b3860902e")), 
    "full" : "build1111_tastcase_20", 
    "hit" : { "24" : 3, "25" : 3 } 
} 

Ваш запрос, чтобы найти соответствующие документы fttc становится простой find(). Так как вы получаете данные из двух коллекций, вам все еще нужно сделать два запроса, но это один меньше запросов, чем текущий подход:

doc = db.mapping.findOne({"_id" : ObjectId("52d74f4941538c0b386090a0")}) 
related = db.fttc.find({"full" : doc.full}); 
0

доступ «полный» по db.dereference(db.mapping.find_one()['tc'])['full']