2

DocumentネストされたProperties(名前、値) コレクションを持つオブジェクトがあります。

"Properties.Name" = "SomePropertyName"今、存在しないドキュメントを見つけたいと思っています。

私はこれを試しましたが、プロパティが存在するがnull値がある場合にのみ機能します:

{"Properties":{"$elemMatch":{"Name":"SomePropertyName", "Value.0":{"$exists":false}}}}

リレーションデータベースのクエリ経験でうまくいくはずのワイルド$neと組み合わせをいくつか試しましたが、役に立ちません。$exists

ドキュメントの例:

[
  {
    "_id": "Document1",
    "Properties": [
      {
        "Name": "SomeName",
        "Value": [
          "value1",
          "value2"
        ]
      },
      {
        "Name": "Property2",
        "Value": [
          "value3"
        ]
      }
    ]
  },
  {
    "_id": "Document2",
    "Properties": [
      {
        "Name": "Property2",
        "Value": [
          "value3"
        ]
      },
      {
        "Name": "Property3",
        "Value": null
      }
    ]
  },
  {
    "_id": "Document3",
    "Properties": [
      {
        "Name": "SomeName",
        "Value": null
      },
      {
        "Name": "Property2",
        "Value": [
          "value3"
        ]
      },
      {
        "Name": "Property3",
        "Value": null
      }
    ]
  }
]

Document2クエリはandを返す必要がありますDocument3(「SomeName」プロパティに対するクエリ)

プロパティが存在しない、またはnull値を持つドキュメントをクエリするにはどうすればよいですか?

4

2 に答える 2

5

これはあなたが望むクエリだと思います:

db.prop.find({$or: [
... {"Properties.Name":{$ne:"SomeName"}},
... {"Properties":{$elemMatch:{"Name":"SomeName","Value":null}}}
... ] })

これは、"SomeName" が設定されていない (つまり、"SomeName" と等しいドキュメントが存在しない) すべてのドキュメントと、Name が "SomeName" であり、同時に "Value" が null であるすべてのドキュメントが必要であることを示しています。

あなたの例で試してみたところ、ドキュメント 2 と 3 が返ってきました。

于 2012-06-10T05:25:04.070 に答える