mongodb在哈希字段上查询$ in

时间:2013-11-10 11:44:57

标签: mongodb

我正在尝试查询以查找哈希字段中存在的值 我的文件enter image description here

我想检索持续时间字段中包含n11和n13的文档。

我虽然会那样。

{
"durations" : { $in: ['n11','n12']}
}

但它不起作用

{
"durations" : { $in: [1,2,3,4,5,6,7,8,9]}
}

但在这两种情况下,我都没有执行查询的结果。

提前感谢您的帮助 我也尝试过用键

2 个答案:

答案 0 :(得分:5)

  

$ in运算符选择字段值等于指定数组中任何值的文档。

durations不等于12n11n12等。因此,这些查询都无法与文档匹配。当您使用$in运算符时,它将仅匹配以下查询:

db.foo.find({
    "durations" : {
        "$in": [{"1" : "n3","2" : "n11", "3": "n12"}]
    }
})

第二个查询可以像这样重写:

db.foo.find({
    $or: [{"durations.1": {$exists: true}},  {"durations.2": {$exists: true}}]
})

如果您想匹配单个值,您必须按完整路径进行操作:

db.foo.find({
    $or: [{"durations.1": "n3"},  {"durations.2": "n11"}]
})

如果想要使用这样的查询:     db.foo.find({"durations" : { $in: ['n11','n12']}})

您需要类似于此的架构:

{
    "_id" : ObjectId("527f7ad945cb10ba295df9fd"),
    "durations" : [
        "n3",
        "n11",
        "n12"
    ]
}

答案 1 :(得分:1)

感谢上一个回答,我找到了解决方案。

我的字段定义如下

/**
 * @MongoDB\Hash
 */
protected $durations;

但Hash类型是为associatives数组定义的,在我的例子中只有值对我来说很重要

所以我把它改成

/**
 * @MongoDB\Collection
 */
protected $durations;

之后我就能够进行此查询

{
"durations" : { $in: ['n11','n12']}
}

我得到了相关的结果。

感谢大家