最近我注意到在进行多次upsert(通过批量操作)和插入(多个文档)之间存在巨大的性能差异.我想知道我是否正确对待这个问题:
find(),update()它可以读取和写入2个内容那性能差异呢?
如果是这种情况,我想知道我是否经常需要大量写入,而不是更新文档,我用一个createdOn字段编写一个新文档.然后查询,我将只查询文件,排序依据createdOn DESC.我想知道这是一个好方法吗?或者,还有更好的方法?
通常,我想在我的一个用户上运行查询,我希望以1对1的关系存储与该用户相关联的行.所以,让我们说(这只是一个任意的例子),我有一个表跟踪用户的汽车,以及一些关于汽车的信息.每个用户可以拥有0或1辆汽车.如果用户没有汽车,则表中没有该用户的条目.
汽车表(再次,只是一个例子):id,user_id,car_make,car_model
所以,当我更新这个表时,我总是会做这样的事情(伪代码):
result = SELECT * FROM cars WHERE user_id=5
if (num_rows(result)>0){
UPDATE cars SET car_make='toyota', car_model='prius' WHERE user_id=5
}else{
INSERT INTO cars (user_id, car_make, car_model) VALUES (5, 'toyota', 'prius')
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能把它变成一个"原子地"起作用的优雅陈述?如果在另一个进程中SELECT和UPDATE语句之间的行被删除,会发生什么?我的UPDATE语句将失败INSERT语句应该运行的地方.我觉得我需要做两个相似(但不同)的陈述来完成同样的事情!我需要的是一些声明,它将向我保证我想要的数据存在于表中,特别是当我只想要一行满足我的要求时.例如,它可能是这样的(当然这是完全构成的):
MAKE SURE A ROW IN cars WHERE user_id=5 IS SET WITH car_make='toyota', car_model='prius'
Run Code Online (Sandbox Code Playgroud)
这样,如果user_id已经存在,那么它将被更新,否则将被插入.此外,如果我更改了要求,例如说每个用户可以拥有给定car_make的零个或一个汽车,那么我可以进一步指定:
MAKE SURE A ROW IN cars WHERE user_id=5 AND car_make='toyota' IS SET WITH car_model='prius'
Run Code Online (Sandbox Code Playgroud)
我希望我的问题有道理!如何改进这种经常出现的基本insert-if-not-found或update-if-found操作?谢谢你的帮助!
我正在编写一个对关键字进行评分的小应用程序.因此,如果"贝鲁特"和"教育"进入,如果以前没有见过,我想创建一个mongo条目,并给他们1分.如果他们有,我想将他们的分数增加一.我试图用一个更新命令来做这个,但我想我可能做错了.
rankingdb.update(
{keyword:key},
{keyword:key, {$inc:{score:1}}},
{upsert:true, safe:false},
function(err, data) {
if (err) {
console.log(err);
}
else {
console.log("score succeeded");
}
}
);
Run Code Online (Sandbox Code Playgroud)
SyntaxError: Unexpected token {
你能不能用增量创建一个全新的文档?
我有一种情况,我经常需要从具有唯一约束的表中获取一行,如果不存在,则创建它并返回.例如我的表可能是:
CREATE TABLE names(
id SERIAL PRIMARY KEY,
name TEXT,
CONSTRAINT names_name_key UNIQUE (name)
);
Run Code Online (Sandbox Code Playgroud)
它包含:
id | name
1 | bob
2 | alice
Run Code Online (Sandbox Code Playgroud)
然后我想:
INSERT INTO names(name) VALUES ('bob')
ON CONFLICT DO NOTHING RETURNING id;
Run Code Online (Sandbox Code Playgroud)
也许:
INSERT INTO names(name) VALUES ('bob')
ON CONFLICT (name) DO NOTHING RETURNING id
Run Code Online (Sandbox Code Playgroud)
让它返回bob的id 1.但是,RETURNING只返回插入或更新的行.所以,在上面的例子中,它不会返回任何东西.为了让它按照需要运行,我实际上需要:
INSERT INTO names(name) VALUES ('bob')
ON CONFLICT ON CONSTRAINT names_name_key DO UPDATE
SET name = 'bob'
RETURNING id;
Run Code Online (Sandbox Code Playgroud)
这看起来有点麻烦.我想我的问题是:
不允许(我)期望行为的原因是什么?
有没有更优雅的方式来做到这一点?
我正在使用Windows Azure表存储并且有一个简单的要求:添加一个新行,用PartitionKey/RowKey覆盖任何现有行.但是,即使我传入ReplaceOnUpdate选项,保存更改也会引发异常:
tableServiceContext.AddObject(TableName, entity);
tableServiceContext.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate);
Run Code Online (Sandbox Code Playgroud)
如果实体已存在,则抛出:
System.Data.Services.Client.DataServiceRequestException: An error occurred while processing this request. ---> System.Data.Services.Client.DataServiceClientException: <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code>EntityAlreadyExists</code>
<message xml:lang="en-AU">The specified entity already exists.</message>
</error>
Run Code Online (Sandbox Code Playgroud)
我是否真的必须首先手动查询现有行并调用DeleteObject它?这似乎很慢.当然有更好的方法吗?
我正在使用Elasticsearch python客户端作为http://elasticsearch-py.readthedocs.org/ 我努力但仍然找不到upup的更新api.任何人都可以给我一个ES python客户端upx api的例子.
我有这个表(由Django生成):
CREATE TABLE feeds_person (
id serial PRIMARY KEY,
created timestamp with time zone NOT NULL,
modified timestamp with time zone NOT NULL,
name character varying(4000) NOT NULL,
url character varying(1000) NOT NULL,
email character varying(254) NOT NULL,
CONSTRAINT feeds_person_name_ad8c7469_uniq UNIQUE (name, url, email)
);
Run Code Online (Sandbox Code Playgroud)
我想批量插入大量使用数据INSERT与ON CONFLICT条款.
皱纹是我需要得到所有行的id背面,无论它们是否已经存在.
在其他情况下,我会做类似的事情:
INSERT INTO feeds_person (created, modified, name, url, email)
VALUES blah blah blah
ON CONFLICT (name, url, email) DO UPDATE SET url = feeds_person.url …Run Code Online (Sandbox Code Playgroud) 我使用MERGE声明作为UPSERT添加新记录或更新当前记录.我有多个线程通过多个连接和多个语句驱动数据库(每个线程一个连接和语句).我一次批处理语句50.
我duplicate key在考试期间遇到违规行为,我感到非常惊讶.我希望这是不可能的,因为MERGE它将作为单个交易执行,或者是它?
我的Java代码如下:
private void addBatch(Columns columns) throws SQLException {
try {
// Set parameters.
for (int i = 0; i < columns.size(); i++) {
Column c = columns.get(i);
// Column type is an `enum` with a `set` method appropriate to its type, e.g. setLong, setString etc.
c.getColumnType().set(statement, i + 1, c.getValue());
}
// Add the insert as a batch.
statement.addBatch();
// Ready to execute?
if (++batched >= MaxBatched) {
statement.executeBatch(); …Run Code Online (Sandbox Code Playgroud) 在这篇文章中,接受的答案解释了你不能在upsert操作下$set和$setOnInsert在upsert操作中使用相同的字段.
有人可以解释为什么会这样吗?看起来$setOnInsert不应该与之冲突$set,因为前者在插入文档时使用,后者在文档更新时使用.
我正在使用postgres 9.5.3,我有一个这样的表:
CREATE TABLE packages (
id SERIAL PRIMARY KEY,
name VARCHAR NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我已定义了一个函数canonical_name,如下所示:
CREATE FUNCTION canonical_name(text) RETURNS text AS $$
SELECT replace(lower($1), '-', '_')
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
我在这个表中添加了一个使用该函数的唯一索引:
CREATE UNIQUE INDEX index_package_name
ON packages (canonical_name(name));
CREATE INDEX
# \d+ packages
Table "public.packages"
Column | Type | Modifiers | Storage | Stats target | Description
--------+-------------------+-------------------------------------------------------+----------+--------------+-------------
id | integer | not null default nextval('packages_id_seq'::regclass) | plain | |
name | character varying | not null | …Run Code Online (Sandbox Code Playgroud)