如何在 mongodb 集合中的多个列上创建唯一键。就像我们使用这个 ADD UNIQUE unique_index( user, email, phonenumber); 在 SQL 中。
我阅读了以下链接,该链接解释了如何通过表达式属性名称使用占位符
我的json文档存储如下:
{"user_json": {"profile.title":"abc"} }"
Run Code Online (Sandbox Code Playgroud)
我的java代码如下
Map<String, String> expressionAttributeNames = new HashMap<String, String>();
expressionAttributeNames.put("#u1", "user_json.profile.title");
String projectionExpression = "user_id, #u1";
QuerySpec spec = new QuerySpec()
.withProjectionExpression(projectionExpression)
.withKeyConditionExpression("user_id = :v_id")
.withNameMap(expressionAttributeNames)
.withValueMap(new ValueMap()
.withString(":v_id", userId))
.withConsistentRead(true);
ItemCollection<QueryOutcome> items = table.query(spec);
Iterator<Item> iterator = items.iterator();
String jsonPretty="";
while (iterator.hasNext()) {
jsonPretty = iterator.next().toJSON();
System.out.println(jsonPretty);
}
Run Code Online (Sandbox Code Playgroud)
问题:无法检索其中有点的文档路径。
有人可以指出这个问题吗?谢谢
问候,
有一天,我偶然发现了 RethinkDB,我对整个实时变化的事情非常着迷。为了学习如何使用这个工具,我快速启动了一个运行 RethinkDB 的容器,并开始制作一个小项目。我想做一些非常简单的事情,因此我考虑创建一项服务,让演讲者可以创造空间,观众可以提问。其他用户可以对问题进行投票,以便让演讲者知道哪一个是最好的。显然,这个项目有很多实时需求,我相信使用 RethinkDB 可以最好地满足这些需求。
我想为此使用一组不同的特定工具。后端将用 Laravel Lumen 制作,前端用 Vue.JS 制作,数据库当然将是 RethinkDB。
尽管不存在安全问题,但 RethinkDB 似乎并不是为了直接暴露给最终用户而设计的。
假设用户只需要实时查看问题和点赞,则不需要写入权限,并且如果用户更改房间 ID,也不会发生任何不良情况,因为房间都是可公开访问的。
因此,需要一些东西来等待数据更新并将其通过套接字推送到客户端(例如socket.io或pusher)。
鉴于后端是用 PHP 编写的,我无法告诉 Lumen 保持清醒并等待数据更新。从我从在线教程中看到的情况来看,应该使用辅助系统来监听更改然后推送它们。(例如,以 Node.js 服务为例)
这是可以理解的,但我坚信这种将数据传输给用户的方式效率低下,并且违背了 RethinkDB 的目的。
如果我必须从客户端计算机发送操作(用户提出问题),将其保存到数据库,有一个监听更改的脚本,然后将更改推送到 socket.io,最后得到客户端(vue.js)当新事件到来时采取行动,首先拥有实时数据库有什么意义?
我可以通过让 Lumen 应用程序将事件直接推送到 socket.io 并使用任何其他数据库系统来避免所有这些头痛。
我真的无法理解这一切的意义。我对 no-sql 数据库没有任何经验,但我真的很想尝试一下。
谢谢。
我是 NoSQL 和 Firebase 的新手。我有这样的路径“作家”数据库。
我尝试使用以下代码查找电子邮件为“test@test.com”的任何用户:
ref.child("writers").queryEqual(toValue: "test@test.com", childKey: "email").observeSingleEvent(of: .value, with: { snap in
print (String(describing: snap.value));
}
Run Code Online (Sandbox Code Playgroud)
但我得到的只是Optional(<null>)在控制台上。我的代码有什么问题吗?我认为这非常简单,但尽管我尝试了任何修复,但我仍无法使其工作。
如果我使用代码,我可以成功获取所有作家数据:
ref.child("writers").observeSingleEvent(of: .value, with: { (snap) in
print (String(describing: snap.value));
}
Run Code Online (Sandbox Code Playgroud) 我想扫描过去 7 天的所有项目,所以我所做的就是生成 7 天前的时间戳并过滤大于该值的时间戳。但这次扫描返回了一些结果。
请参阅以下 JavaScript:
const daysBack = (days) => {
let date = new Date();
date.setDate(date.getDate() - days);
return date.getTime() ;
}
const params = {
TableName: process.env.DYNAMODB_TABLE,
FilterExpression: "#ts > :z",
ExpressionAttributeNames:{
"#ts": "timestamp"
},
ExpressionAttributeValues: {
":z": daysBack(7)
},
};
dynamoDb.scan(params, (error, result) => {
// ...
}
Run Code Online (Sandbox Code Playgroud) AWS DynamoDB 文档包含论坛的示例架构。然而,该模式能够回答的问题数量似乎很少。此外,该表似乎还存在热键问题(同一分区上的大量回复备份)。
在题为“Amazon DynamoDB 的高级设计模式”的演讲中,演示者用了大约 43 分钟的时间,仅使用具有 3 个 GSI(索引)的单个表分解了Audible 的复杂用例。
我正在尝试从标准 RDBMS 3NF 背景学习正确的 DynamoDB 建模。如何设计论坛来防止热分区,同时仍然满足这些常见用例?
查询:
基本架构(?):
- 论坛:分区键:Forum_GUID。属性:名称、描述
- 用户:分区键:User_GUID。属性:电子邮件、加入日期
- 主题:复合键:Forum_GUID、Topic_GUID。属性:posted_by、日期、投票、正文、主题
- 回复:复合键:Topic_GUID、Reply_GUID。属性:posted_by、日期、投票、正文
我假设有多种解决方案(包括使用单个表)。我正在寻找任何可以解决此问题的答案,同时提供有关何时以及如何正确使用索引来扩展应用程序写入的指导。
database database-design amazon-web-services nosql amazon-dynamodb
根据我的理解,我们可以将 SQL 与 NoSQL 进行比较,就像数组与 hashmap/dict 一样。
(让我们考虑一下 PostgreSQL 与 MongoDB 只是为了上下文)
SQL 按表排列并在行中搜索您要查找的内容。
NoSQL 以键值方式排列,因此如果您知道键,您将“直接”获得值,而无需搜索任何内容。
考虑到上述情况,当我在 SQL 中仅使用主键作为获取一项的 WHERE 进行查询时,它是否仍然执行行搜索,还是对行执行“直接”命中?
我希望我的疑问已被理解
我正在开发一个 Flutter 应用程序,每个用户都可以创建项目并与其他用户共享项目。我创建了一个“共享”集合,其中每个用户的 ID 都是一个文档,在该文档中,与该用户共享的所有项目 ID 都像这样收集,并使用一个布尔值来表示共享是否已被共享。尚未接受:
接下来,我创建了项目本身的集合,如下所示:
现在,我想查询“项目”集合并仅返回给定用户的“共享”列表中的项目。首先,如何获取共享列表中每个文档的ID?其次,是否可以使用子句将该 ID 与列表的内容进行比较.where()?
我一直在尝试这样的事情,但没有成功:
Stream<List<Map<String, dynamic>>> getListOfProjectsForUser({@required List<String> shares}) {
var ref = _firestore.collection('projects');
return ref
.where(shares, arrayContains: ref.id)
.snapshots()
.map((QuerySnapshot snapshot) => snapshot.docs.map((DocumentSnapshot doc) => doc.data()).toList());
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过这个:
Stream<List<Map<String, dynamic>>> getListOfProjectsForUser({@required List<String> shares}) {
var ref = _firestore.collection('projects');
return ref
.where(shares, arrayContains: FieldPath.documentId)
.snapshots()
.map((QuerySnapshot snapshot) => snapshot.docs.map((DocumentSnapshot doc) => doc.data()).toList());
}
Run Code Online (Sandbox Code Playgroud)
我想做的事情可能吗?我已经搞砸了两天了,我的头爆炸了。任何帮助将不胜感激。提前致谢。
我有很多用户(150-2亿)。每个用户有 N(30-100) 个属性。该属性可以是整数、文本或时间戳类型。属性是未知的,所以我想动态地、即时地添加它们。
解决方案 1 - 通过更改表添加新列
CREATE TABLE USER_PROFILE(
UID uuid PRIMARY KEY,
LAST_UPDATE_DATE TIMESTAMP,
CREATION_DATE TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)
对于每个新属性:
ALTER TABLE USER_PROFILE ADD AGE INT;
INSERT INTO USER_PROFILE ( UID, LAST_UPDATE_DATE, CREATION_DATE, AGE) VALUES ('01f63e8b-db53-44ef-924e-7a3ccfaeec28', 2021-01-12 07:34:19.121, 2021-01-12 07:34:19.121, 27);
Run Code Online (Sandbox Code Playgroud)
解决方案 2 - 固定架构:
CREATE TABLE USER_PROFILE(
UID uuid,
ATTRIBUTE_NAME TEXT,
ATTRIBUTE_VALUE_TEXT TEXT,
ATTRIBUTE_VALUE_TIMESTAMP TIMESTAMP,
ATTRIBUTE_VALUE_INT INT,
LAST_UPDATE_DATE TIMESTAMP,
CREATION_DATE TIMESTAMP,
PRIMARY KEY (UID, ATTRIBUTE_NAME)
);
Run Code Online (Sandbox Code Playgroud)
对于每个新属性:
INSERT INTO USER_PROFILE ( UID, ATTRIBUTE_NAME, ATTRIBUTE_VALUE_INT, LAST_UPDATE_DATE, CREATION_DATE) VALUES ('01f63e8b-db53-44ef-924e-7a3ccfaeec28', 'age', …Run Code Online (Sandbox Code Playgroud)