2

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

它不起作用,但似乎是因为_property 前面的 char _account。因此,如果我将要搜索的字符串放在该对象的 name 属性中,则使用点表示法一切正常。

属性名称有什么限制吗?认为 an_是允许的,因为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

                }
            ]
        }
    ]
}
4

2 回答 2

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"
                }
            ]
        }
    ]
}

两者都将返回示例文档。

于 2013-11-05T21:17:48.360 回答
0

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

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

由于您的查询与数据不匹配,因此查询将找不到与示例文档匹配的内容:

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

应该工作的简化查询是:

db.shares.find(
    {
        "type": "image/jpeg",
        "shares._account": "526fcb177675f27140000002" 
    }
)
于 2013-11-05T21:22:55.987 回答