0

いくつかのモデルが埋め込まれたモデルがあります。レコードが存在するかどうかを確認するためにクエリを実行する必要があります。問題は、クエリに次のパラメータを含める必要がある複数の埋め込みドキュメントへの参照を含める必要があることです。

{
 "first_name"=>"Steve",
 "last_name"=>"Grove",
 "email_addresses"=>[
     {"type"=>"other", "value"=>"steve@stevegrove.com", "primary"=>"true"}
 ],
 "phone_numbers"=>[
     {"type"=>"work_fax", "value"=>"(720) 555-0631"},
     {"type"=>"home", "value"=>"(303) 555-1978"}
 ],
 "addresses"=>[
     {"type"=>"work", "street_address"=>"6390 N Main Street", "city"=>"Elbert", "state"=>"CO"}
 ],
}

_idや関連付けなどの一部のフィールドが欠落している場合でも、すべての埋め込みドキュメントをクエリするにはどうすればよいですか?

4

3 に答える 3

1

考えるべきことがいくつかあります。

  1. クエリにこれらすべてのパラメータが含まれていることを確認しますか?レコードを一意に識別するこの情報のサブセットはありませんか?first_name( 、、、last_nameおよび)と言いemail_addresses.valueます。より少ない作業で同じことを達成できれば、すべての条件を照会するのはばかげています。

  2. Mongoidでは、where基準を使用すると、まっすぐなjavascriptを使用できるため、javascript基準の記述方法を知っている場合は、javascriptの文字列をwhereに渡すことができます。

  3. そうでなければ、あなたは本当に厄介なwhere基準ステートメントを書くことを余儀なくされます、ありがたいことにあなたはドット表記を使うことができます。

何かのようなもの:

UserProfile.where(first_name: "Steve", 
                   last_name: "Grove", 
                   :email_addresses.matches => {type: "other", 
                                                value: "steve@stevegrove.com", 
                                                primary: "true"}, 
                    ..., ...)
于 2012-05-02T15:46:27.530 に答える
0

組み込みjsのリクエストに応じて:

query = %{
  function () {
    var email_match = false;
    for(var i = 0; i < this.email_addresses.length && !email_match; i++){
      email_match = this.email_addresses[i].value === "steve@stevegrove.com";
    }
    return this.first_name === "Steve" &&
      this.last_name === "Grove" &&
      email_match;
  }
}
UserProfile.where(query).first

きれいではありませんが、機能します

于 2013-02-01T23:42:19.113 に答える
0

Mongoid 3では、http://mongoid.org/en/origin/docs/selection.html#symbolを使用できますelem_match

UserProfile.where(:email_addresses.elem_match => {value: 'steve@stevegrove.com', primary: true})

これは、

class UserProfile
  include Mongoid::Document
  embeds_many :email_addresses
end

これらのフィールドをすべて含める必要がある場合は、を使用することをお勧めしUserProfile.collection.aggregate(query)ます。この場合、すべてのフィールドで巨大なハッシュを構築できます。

query = { '$match' => {
  '$or' => [
    {:email_addresses.elem_match => {value: 'steve@stevegrove.com', primary: true}}
  ]
} }

それは少しおかしくなり始めますが、うまくいけば、それはあなたの選択肢が何であるかについての洞察をあなたに与えるでしょう。別の例については、https://coderwall.com/p/dtvvhaを参照してください。

于 2014-04-16T17:13:48.140 に答える