получить все данные из одного поля с помощью _id
db.student.find({}, {roll:1})
SELECT roll FROM student
blockquote>получить все данные из одного поля без _id
db.student.find({}, {roll:1, _id:0})
найти определенные данные, используя предложение where
db.student.find({roll: 80})
SELECT * FROM students WHERE roll = '80'
blockquote>найти данные используя условие where и больше, чем условие
db.student.find({ "roll": { $gt: 70 }})
SELECT * FROM student WHERE roll> '70'
blockquote>найти данные, используя предложение where и меньше или равно условию
db.student.find({ "roll": { $lte: 70 }})
SELECT * FROM student WHERE roll & lt; = '70'
blockquote>найти данные, используя where where и меньше, чем до условие
db.student.find({ "roll": { $lt: 70 }})
SELECT * FROM student WHERE roll & lt; '70'
blockquote>
(здесь автор GRMustache)
До тех пор, пока не будет выведена из строя ориентированная на усталость библиотека Усы, я предлагаю, чтобы ваши классы наследовали от NSObject (так, чтобы они имели метод valueForKey:
). Затем GRMustache извлекает значения с помощью этого метода.
Если это все равно не будет работать (пустые значения в рендеринге), вы можете попытаться отключить функции безопасности GRMustache (см. https: // github. com / groue / GRMustache / blob / master / Guides / security.md # disabling-safe-key-access )
Если у вас возникли другие проблемы, пожалуйста, откройте проблему прямо в репозитории : https://github.com/groue/GRMustache/issues
РЕДАКТИРОВАТЬ 2 февраля 2015 г.: GRMustache.swift отсутствует: http://github.com /groue/GRMustache.swift
Это немного взломать, используя отражение. Может быть использовано следующее:
protocol PropertyReflectable { }
extension PropertyReflectable {
subscript(key: String) -> Any? {
let m = Mirror(reflecting: self)
for child in m.children {
if child.label == key { return child.value }
}
return nil
}
}
struct Person {
let name: String
let age: Int
}
extension Person : PropertyReflectable {}
Затем создайте Person
и получите доступ к его ключевым свойствам.
let p = Person(name: "John Doe", age: 18)
p["name"] // gives "John Doe"
p["age"] // gives 18
Вы можете всегда изменить индекс возвращает интерполированную строку значения свойства.
Ответ Shim выше не работает в Swift 4. Есть две вещи, о которых вы должны знать.
Прежде всего, если вы хотите использовать функцию value(forKey:)
, ваш класс должен наследовать NSObject
.
Во-вторых, поскольку Objective-C ничего не знает о типе значения, вы должны поместить ключевое слово @objc
перед вашими свойствами типа значения, а Swift сделает тяжелую работу для вас.
Вот пример:
import Foundation
class Person: NSObject {
@objc var name: String = "John Dow"
@objc var age: Int = 25
@objc var height: Int = 180
subscript(key: String) -> Any? {
return self.value(forKey: key)
}
}
let person: Person = Person()
person["name"] // "John Dow"
person["age"] // 25
person["height"] // 180
Я полагаю, вы могли бы сделать:
class User {
let properties = Dictionary<String,String>()
subscript(key: String) -> String? {
return properties[key]
}
init(name: String, title: String) {
properties["name"] = name
properties["title"] = title
}
}
Не зная вашего варианта использования, я бы настоятельно советовал вам не делать этого.
Другой подход:
class User {
var name : String
var title : String
subscript(key: String) -> String? {
switch key {
case "name" : return name
case "title" : return title
default : return nil
}
}
init(name: String, title: String) {
self.name = name
self.title = title
}
}
Возможно, стоит отметить, что Swift, похоже, в настоящее время не поддерживает отражение по именам. Функция reflect
возвращает Mirror
, индекс которой основан на Int
, а не String
.
Добавление некоторого синтаксического сахара в ответ Бензи:
protocol PropertyReflectable { }
extension PropertyReflectable {
subscript(key: String) -> Any? {
let m = Mirror(reflecting: self)
return m.children.first { $0.label == key }?.value
}
}
struct Person {
let name: String
let age: Int
}
extension Person : PropertyReflectable {}
Затем создайте Person
и получите доступ к его свойствам.
let p = Person(name: "John Doe", age: 18)
p["name"] // gives "John Doe"
p["age"] // gives 18
Использование valueForKey должно позволить вам получать доступ к свойствам, используя их имена. Убедитесь, что вы работаете с объектом, который наследует NSObject
class people: NSObject {
var age: NSString = "44"
var height: NSString = "153"
}
let person:people = people()
let stringVariable = "age"
person.valueForKey("age")
// Print "44"
person.valueForKey("\(stringVariable)")
// Print "44"