Учитывая приведенные ниже конкурирующие схемы с до 100 000 друзьями, я заинтересован в поиске наиболее эффективных для моих нужд.
Doc1 (Index on user_id)
{
"_id" : "…",
"user_id" : "1",
friends : {
"2" : {
"id" : "2",
"mutuals" : 3
}
"3" : {
"id" : "3",
"mutuals": "1"
}
"4" : {
"id" : "4",
"mutuals": "5"
}
}
}
Doc2 (сложный многозначный индекс на user_id и friends.id)
{
"_id" : "…",
"user_id" : "1",
friends : [
{
"id" : "2",
"mutuals" : 3
},
{
"id" : "3",
"mutuals": "1"
},
{
"id" : "4",
"mutuals": "5"
}
]}
Кажется, я не нашел никакой информации об эффективности поиска в подпоследовательности. Я знаю, что mongo реализует данные внутри BSON, поэтому Im задается вопросом, означает ли это, что проекционный поиск является двоичным O (log n)?
В частности, с учетом user_id, чтобы узнать, существует ли друг с friend_id, как бы два разных запроса в каждой схеме сравнивались? (Предположим вышеприведенные индексы) Обратите внимание, что на самом деле не имеет значения, что вернулось, возвращается только то, что не null, если друг существует.
Doc1col.find({user_id : "…"}, {"friends.friend_id"})
Doc2col.find({user_id : "…", "friends.id" : "friend_id"}, {"_id":1})
Также интересен способ модификации $set. Для схемы 1, учитывая запрос Doc1col.update({user_id : "…"}, {"$set" : {"friends.friend_id.mutuals" : 5})
, как работает поиск в friend.friend_id? Является ли это операцией O (log n) (где n - количество друзей)?
Для схемы 2, как бы запрос Doc2col.update({user_id : "…", "friends.id" : "friend_id"}, {"$set": {"friends.$.mutuals" : 5})
сравнивался с запросом выше?