如何在MongoDB文档数组中搜索字符串并在查找操作中投影数组值?

时间:2013-10-11 19:37:20

标签: arrays json mongodb

我创建并插入了一些简单的json文档,每个文档都有一个数组到mongo:

MongoDB shell version: 2.4.6

use test
> db.sandbox.insert({ "array1" : [ "praxis a", "value b", "theory c"] })
> db.sandbox.insert({ "array1" : [ "mean d", "minimum e"] })
> db.sandbox.insert({ "array1" : [ "maximum f"] })

然后我在集合中搜索包含以字符串'field1'

开头的array1值的文档
> db.sandbox.find({"array1" : /praxis/})

这按预期返回了一个文档:

{ "_id" : ObjectId("52585223b8a783860470f07b"), "array1" : [  "praxis a",  "value b",  "theory c" ] }

但是,我真正想要的只是返回匹配的array1字段值。所以我尝试从数组中投射第一个匹配的项目:

> db.sandbox.find({"array1" : /praxis/}, {_id: 1, "array1.$": 1})

当我尝试这个时,我遇到了一个奇怪的错误:

    error: {
        "$err" : "positional operator (array1.$) requires corresponding field in
 query specifier",
        "code" : 16352
        }

我希望得到的是价值:

"field1: a"

我认为我的目标是取回阵列:

{ "array1: [ "praxis a", "value b", "theory c"] }

我很感激find函数的一些帮助以及如何使用$ match ...

从数组中投影值

1 个答案:

答案 0 :(得分:0)

这确实看起来像一个错误,类似于SERVER-9028

似乎有两种解决办法,因为这两种方法都有效:

db.sandbox.find({array1: 'praxis a'}, {'array1.$': 1})

OR

db.sandbox.find({array1: {$in: [/praxis a/]}}, {'array1.$': 1})

这两个产生的输出:

{
  "_id": ObjectId("5258620315b3beb195f855b8"),
  "array1": [
    "praxis a"
  ]
}