MongoDB集合属性名称是否有限制?

时间:2013-11-05 20:49:19

标签: mongodb mongoose

我有一个文档结构,其中包含一个名为shares的属性,它是一个对象数组。 现在,我尝试将shared包含匹配的_account字符串的所有文档与点符号(shares._account)进行匹配。

它不起作用,但似乎是因为属性_前面的_account字符。 因此,如果我将字符串用于搜索该对象中name属性的内部,一切都可以使用点表示法。

属性名称是否有任何限制? 认为_是允许的,因为id也有mongodb,对我而言,这是daclare绑定的一种约定。

示例:

    // Collection Item example
{
  "_account": { "$oid" : "526fd2a571e1e13b4100000c" },
  "_id": { "$oid" : "5279456932db6adb60000003" },
  "name": "shared.jpg",
  "path": "/upload/24795-4ui95s.jpg",
  "preview": "/img/thumbs/24795-4ui95s.jpg",
  "shared": false,
  "shares": [
    {
      "name": "526fcb177675f27140000001",
      "_account": "526fcb177675f27140000001"
    },
    {
      "name": "tim",
      "_account": "526fd29871e1e13b4100000b"
    }
  ],
  "tags": [
    "grüngelb",
    "farbe"
  ],
  "type": "image/jpeg"
},

我尝试使用以下查询获取该项:

// Query example
{
    "$or": [
        {
            "$and": [
                {
                    "type": {
                        "$in": ["image/jpeg"]
                    }
                }, {
                    "shares._account": "526fcb177675f27140000001"    // Not working
                    //"shares.name": "526fcb177675f27140000001"    //   Working

                }
            ]
        }
    ]
}

2 个答案:

答案 0 :(得分:0)

除了$and可以省略且$or毫无意义"image/jpeg"!= "image/jpg"

db.foo.find({
    "type": {"$in": ["image/jpeg"]},
    "shares._account": "526fcb177675f27140000002"
})

或者如果你真的想要旧的:

db.foo.find({
    "$or": [
        {
            "$and": [
                {
                    "type": {
                        "$in": ["image/jpeg"]
                    }
                }, {
                    "shares._account": "526fcb177675f27140000002"
                }
            ]
        }
    ]
}

两者都将返回示例文档。

答案 1 :(得分:0)

您当前的查询有一些不必要的复杂构造:

  • 您不需要$or$and子句(“和”是默认行为)
  • 您使用$in
  • 匹配单个值

查询将找不到与示例文档匹配,因为您的查询与数据不匹配:

  • 您要查找的type字段是“image / jpg”,但您的示例文档中包含“image / jpeg”
  • 您要查找的shares._account值为“526fcb177675f27140000001”,但您的示例文档不包含此内容。

应该有效的简化查询是:

db.shares.find(
    {
        "type": "image/jpeg",
        "shares._account": "526fcb177675f27140000002" 
    }
)