如何检查对象嵌套属性的存在?

时间:2012-06-09 06:56:55

标签: mongodb

我有一个带有嵌套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
      }
    ]
  }
]

查询应返回Document2Document3(查询“SomeName”属性)

如何查询属性不存在或具有null值的文档?

2 个答案:

答案 0 :(得分:5)

我相信这是您想要的查询:

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

这表示您希望所有未设置“SomeName”的文档(即没有存在的文档等于“SomeName”)以及Name为“SomeName”且同时为“Value”的所有文档是空的。

我在你的例子上试了一下,然后拿回了文件2和3。

答案 1 :(得分:1)

这应该可以解决问题

'Properties.Name' : { $exists : true, $ne: null }