迭代从MongoDB获取的字符串数组

时间:2017-02-16 01:09:46

标签: swift mongodb

我正在使用MongoKitten库从mongoDB中获取文档。

我的mongoDB中有以下文档:

{
    ...
    foo: ["A", "B"]
    ...
}

我可以查询db,但是我无法遍历返回文档的foo数组。例如,假设我将查询结果保存到mongoDocs

for Doc in mongoDocs {
    print(Doc["foo"] as Any) // prints ["A", "B"]
    var tempFoos = [String]()
    for foo in Doc["foo"] { // gives error: Type 'Value' does not conform to protocol "Sequence"
        print("Foo: " + foo)
        tempFoos.append(foo)
     }
}

我理解错误。基本上,我的foo数组不符合允许我循环它的Sequence协议。但是我该如何解决这个问题?

修改 - 这是我用来获取mongoDocs的代码。我打印了结果并使用了其他属性。我似乎无法遍历这个数组。

mongoDocs = try self.geographiesCollection!.find(matching: q, projecting: projection, limitedTo: 100)

这是relevant function in the MongoKitten source code。该函数返回Cursor<Document>

3 个答案:

答案 0 :(得分:3)

在这里,您可以查看框架开发人员如何解释处理这种情况。 MongoKitten closed issue 27

这里有一些他的解释引用,因为链接变得无效。

“订阅文档时,MongoKitten BSON库始终返回枚举(值)。”

“BSON数组实际上只是一个带有从0到x的键的文档,因此数组的枚举大小写有一个文档作为它的关联值。因为Value也可以是一个双重或一个日期,它不会' t符合序列协议。

迭代数组的最简单方法是使用Value上的文档便捷访问器。如果Value是数组或文档,则返回基础文档;如果是其他内容,则返回空文档。然后你可以像这样迭代:“

for (key, val) in doc["vals"].document {
   print("Value is \(val)")
}

答案 1 :(得分:1)

将其转换为数组:

for Doc in mongoDocs {
    guard let arr = Doc["foo"] as? [String] else { continue }
    for foo in arr {
        // do your things
    }
}

答案 2 :(得分:0)

我认为您正在使用BSON 3Value是包含多个案例的枚举,您可以看到here。这是我的抨击:

for doc in mongoDocs {
    guard case Value.array(let fooArray)? = doc["foo"] {
        fatalError("doc[\"foo\"] is not an array")
    }

    print(fooArray)
}