/ / Mongoid - дві умови запиту повинні відповідати обом у вбудованому документі? - ruby-on-rails, mongodb, mongoid

Mongoid - два умови запиту на обидва зустрічаються в вбудований документ? - рубіни на рейках, монгобби, монгоди

У мене є дві моделі

class User
include Mongoid::Document
include Mongoid::Timestamps
field :username
embeds_many :user_tags
end

class UserTag
include Mongoid::Document
field :name
field :like_count, :type => Integer, :default => 0
embedded_in :user
end

Я хочу запитати всіх користувачів, у яких є тег користувача з ім'ям "nyc" і де у тегу користувача "nyc" є like_count> 10. Я спробував наступне:

users = User.where("user_tags.name" => "nyc").and("user_tags.like_count" => {"$gte" => 10 })

Логічно, що це робить те, що слід робити, алене те, що мені це потрібно робити. Він повертає користувачів, які мають user_tag "nyc" і мають будь-який user_tag з like_count> = 10. Мені потрібні користувачі, які мають user_tag "nyc" і де user_tag "nyc" "s_count_count>> = 10.

Як це зробити? Я запускаю монгоїд 4.0.2.

Відповіді:

1 для відповіді № 1

Насправді ваш запит неправильний для тієї мети, яку ви намагаєтесь досягти. Це перекладається на такий запит MongoDB:

db.users.find({"user_tags.name": "nyc" }, {"user_tags.like_count": {$gte: 10}})

Це означає, що MongoDB знайде всі документи з обома критеріями. Mongoid повертає вам ті самі дані, що і MongoDB.

Натомість вам потрібен такий запит MongoDB:

db.users.find({ user_tags: {
$elemMatch: {
name: "nyc",
like_count: { $gte: 10  }
}
}})

За допомогою Mongoid ви можете написати:

User.where(user_tags: {
"$elemMatch" => {
name: "nyc",
like_count: { "$gte" => 10 }
}
}).count

0 для відповіді № 2

Можливо, вам слід написати щось подібне:

users = User.where("user_tags.name" => "nyc", "user_tags.like_count" => {"$gte" => 10 })

Mongoid спробує знайти документи, які відповідають обом умовам.


0 для відповіді № 3

Ви можете спробувати це

users = User.where("user_tags.name" => "nyc").where("user_tags.like_count" => {"$gte" => 10 }).all

або

users = User.where("user_tags.name" => "nyc", "user_tags.like_count" => {"$gte" => 10 }).all