如何解决使用 ParseSwift 查询 mongo DB
我在 Mongo DB 中有两个集合。
以下是文档在第一个集合 (MainCollection
) 中的外观:
_id
:"mzWqPEDYRU"
TITLE
:"ZAZ: I want."
ownerID
:"lGutCBY52g"
accessKey
:"0kAd4TOmoK0"
_created_at
:2020-03-13T11:42:11.169+00:00
_updated_at
:2020-03-13T17:08:15.090+00:00
downloadCount
:2
这是它在第二个集合 (SecondCollection
) 中的样子:
_id
:"07BOGA8bHG"
_p_unit
:"MainCollection$mzWqPEDYRU"
SENTENCE
:"I love nature peace and freedom."
Order
:5
ownerID
:"lGutCBY52g"
AUdio
:"07067b5589d1edd1d907e96c1daf6da1_VOICE.bin"
_created_at
:2020-03-13T11:42:17.483+00:00
_updated_at
:2020-03-13T11:42:19.336+00:00
第一个和第二个集合之间存在父子关系。在最后一个文档中,我们可以看到 _p_unit 字段,其中“mzWqPEDYRU”部分指向第一个集合中父项的 id。
虽然我终于得到了我想要的,使用给定的父级获取第二个集合的元素,但它没有完成。
我在对 SecondCollection
进行选择性查询时遇到一个问题。这是当前工作的代码:
func theFunction(element: MainCollection) {
do {SecondCollection.query().find() {
result in
switch result {
case .success(let items):
print("items.count = \(items.count)")
var finalCount = 0
for item in items {
// Ignore useless elements:
if item.unit?.objectId != element.objectId! {continue}
finalCount += 1
/// .... Work with selected element.
}
print("finalCount = \(finalCount)")
case .failure(let error):
print("Error in \(#function): \(error)")
}
}
}
}
上述代码的编写方式在我获得我感兴趣的 SecondCollection 中的元素的意义上起作用。但是 for 循环 中的这个技巧可以消除不需要的元素不是要走的路。
if item.unit?.objectId != element.objectId! {continue}
过滤应该发生在查询中,行:
SecondCollection.query().find()
问题是我尝试过的一切都失败了。我做了这样的事情:
SecondCollection.query("unit" == element.objectId!).find()
有无数的变化,但都没有运气。
有人知道正确的语法吗?
如果这可能有用,以下是 SecondCollection 的声明方式:
struct SecondCollection: ParSEObject,Identifiable,Equatable,Hashable {
// These fields are required for any Object.
var objectId: String?
var createdAt: Date?
var updatedAt: Date?
var ACL: ParseACL?
// Local properties.
var id:UUID {return UUID()}
var SENTENCE: String?,Order: Int?,ownerID: String?,AUdio: ParseFile?,unit: Pointer<MainCollection>?
.......
}
解决方法
首先,我认为引入所有元素然后“消除”不需要的元素并不是一个好方法。这样你检索的数据比需要的多得多,而且非常低效。 我尝试了您的代码,但您没有明确(至少对我而言)是否在这些类之间使用指针或关系。每个人的方法都不同。 你用的是哪一个?
更新:嘿!我想我可以让它像你需要的那样工作。 我创建了两个类ParentClass(名称:字符串,年龄:数字,孩子:与ChildClass的关系):
struct ParentClass: ParseObject {
//: These are required for any Object.
var objectId: String?
var createdAt: Date?
var updatedAt: Date?
var ACL: ParseACL?
//: Your own properties.
var name: String?
var age: Int = 0
var children: ParseRelation<Self> {
ParseRelation(parent: self,key: "children",className: "ChildClass")
}
}
和 ChildClass (name: string,age:number):
struct ChildClass: ParseObject {
//: These are required for any Object.
var objectId: String?
var createdAt: Date?
var updatedAt: Date?
var ACL: ParseACL?
//: Your own properties.
var name: String?
var age: Int = 0
}
然后我做了一个简单的查询来找到第一个父级。你可以使用 find() 方法并带上你需要的所有方法,但我这样做是为了让它更容易解释:
让 parentQuery = ParentClass.query()
parentQuery.first { result in
switch result {
case .success(let found):
print ("FOUND A PARENT!")
print(found.name!)
print(found.age)
print(found.children)
case .failure(let error):
print(error)
}
}
现在我得到了 Parent(在我的例子中有两个孩子),我使用 query() 方法在 ChildClass 上生成查询,其中包含所有 ChildClass 对象和找到的父级:
do {
let childrenObject = ChildClass()
try found.children.query(childrenObject).find()
{ result in
switch result {
case .success(let allChildrenFromParent):
print("The following Children are part of the \(found.name!):")
for child in allChildrenFromParent {
print("\(child.name!) is a child of \(found.name!)")
}
case .failure(let error):
print("Error finding Children: \(error)")
}
}
} catch {
print("Error: \(error)")
}
整个代码最终是这样的:
let parentQuery = ParentClass.query()
parentQuery.first { result in
switch result {
case .success(let found):
print ("FOUND A PARENT!")
print(found.name!)
print(found.age)
print(found.children)
do {
let childrenObject = ChildClass()
try found.children.query(childrenObject).find()
{ result in
switch result {
case .success(let allChildrenFromParent):
print("The following Children are part of the \(found.name!):")
for child in allChildrenFromParent {
print("\(child.name!) is a child of \(found.name!)")
}
case .failure(let error):
print("Error finding Children: \(error)")
}
}
} catch {
print("Error: \(error)")
}
case .failure(let error):
print(error)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。