9

次のスキーマがあります。

var Child = new mongoose.Schema({
    'field': String,
    'value': String
  });

var Parent = new mongoose.Schema({
    'name': String,
    'children': [ Child ]
  });

次の JSON オブジェクトに対応する のParentを返したい:Child

{ 'field': 'Family Name', 'value': 'Smith' }

私はこれを試しました:

Parent.findOne({ 'children': { 'field': 'Family Name', 'value': 'Smith' } }, fn ...)

しかし、それは取得し続けnullます。

編集:

Mongo シェル拡張でテストしたところ、Childサブドキュメントに独自_idの があることがわかりました。それをクエリに追加すると_id、ドキュメントがフェッチされparentます。さて、その子がどうなるかは前もってわかりませんid。では、サブドキュメント クエリから削除するにはどうすればよいでしょうか。(つまり、上記のクエリは文字通り 2 つのプロパティのみを持つ JSON オブジェクトを探しますが、サブドキュメントには 3 つのプロパティがあります)

私の環境は: Node.js、Mongoose、MongoDB

4

2 に答える 2

10

$elemMatchこの問題を解決するクエリ演算子のようです。実際のクエリは次のように記述します。

Parent.findOne({ 'children': { $elemMatch: { 'field': 'Family Name', 'value': 'Smith' } } }, fn ...)
于 2013-03-28T16:37:19.597 に答える
5

子ドキュメントでフィールド、値構造を使用する理由はありますか? のように、単にキーをフィールドとして使用する方が簡単です{"FamilyName": "Smith"}。これにより、次のようなことが可能になります。

Parent.findOne({'children.FamilyName': 'Smith'}, function(err, doc){...});
于 2013-03-28T16:30:47.517 に答える