这个问题是密切相关的这一个,我会考虑在NoSQL的情况下给出关于架构设计的意见,但我很好奇,想明白这一点:
假设您有以下文档:
_id : 2 abcd
name : 2 unittest.com
paths : 4
0 : 3
path : 2 home
queries : 4
0 : 3
name : 2 query1
url : 2 www.unittest.com/home?query1
requests: 4
1 : 3
name : 2 query2
url : 2 www.unittest.com/home?query2
requests: 4
Run Code Online (Sandbox Code Playgroud)
基本上,我想知道
如果可以在涉及"嵌套度"大于1的数组/文档结构的更新方案中多次使用MongoDB的位置$运算符(详细信息),或者换句话说不同:
{ <update operator>: { "paths.$.queries.$.requests" : value } }(不起作用)
而不是"只"能够使用$ 一次顶级数组并绑定为"更高级别"上的数组使用显式索引:
{ <update operator>: { "paths.$.queries.0.requests" : …
我想从R获取MongoDB查询
有了mongoshell,我会查询:
db.user.find({age:{$gt:21}})
Run Code Online (Sandbox Code Playgroud)
但是,在R-Mongo中,我还没有找到如何描述这个查询.
谢谢
我正在尝试使用rmongodb从MongoDB数据库中获取信息以便在R中进一步处理.但是,我真的开始时遇到了一些困难.这个工作:
cursor <- mongo.find(mongo, "people", query=list(last.name="Smith", first.name="John"),
fields=list(address=1L, age=1L))
while (mongo.cursor.next(cursor)){
print(mongo.cursor.value(cursor))}
Run Code Online (Sandbox Code Playgroud)
现在,如果我想找到名字是"John"或"Bob"或"Catherine"的人呢?我试过query=list(last.name="Smith", first.name=c(John, Bob, Catherine))但这没有用.替换也没有=用%.
另一个问题是数据库内容是嵌套的,这意味着我有子树,子树等等.例如,对于条目first.name="John", last.name="Smith"我可能有子条目address, age, occupation,并且再次占用我可能有类别作为子树(例如从2005年到2012年的年份和每年我都会有一个像"失业","职员","企业家"这样的条目.那么,如果我想找到所有名字为"约翰"的人,他们已经40岁并且在2010年失业了怎么办?查询会是什么样的?
编辑作为对Stennie的回复:这是我的数据库结构和我正在尝试的查询的示例.想象一下,一所大学的校友被细分为小组(例如"非常好的学生","好学生"等).然后,每个组都包含已分配给该组的人员列表及其详细信息.
(0){..}
_id : (Object ID) class id
groupname: (string) unique name for this group (e.g. "beststudents")
members[11]
(0){..}
persid : (integer) 1
firstname: (string)
surname: (string)
age: (integer)
occupation: (string)
(1){..}
persid : (integer) 2
firstname: (string)
surname: (string)
age: (integer)
occupation: (string)
# and so on …Run Code Online (Sandbox Code Playgroud) 我正在使用rmongodb来获取特定集合中的每个文档.它可以工作,但我正在使用数百万个小文档,可能是100M或更多.我正在使用网站上作者建议的方法:cnub.org/rmongodb.ashx
count <- mongo.count(mongo, ns, query)
cursor <- mongo.find(mongo, query)
name <- vector("character", count)
age <- vector("numeric", count)
i <- 1
while (mongo.cursor.next(cursor)) {
b <- mongo.cursor.value(cursor)
name[i] <- mongo.bson.value(b, "name")
age[i] <- mongo.bson.value(b, "age")
i <- i + 1
}
df <- as.data.frame(list(name=name, age=age))
Run Code Online (Sandbox Code Playgroud)
这适用于数百或数千个结果但是循环非常非常慢.有什么方法可以加快速度吗?也许是多处理的机会?任何建议,将不胜感激.我平均每小时1M,按照这个速度,我只需要一周时间来构建数据框.
编辑:我注意到while循环中的矢量越多,它就越慢.我现在正试图为每个向量分别循环.虽然看起来仍然像黑客,但必须有更好的方法.
编辑2:我对data.table运气不错.它仍在运行,但看起来它将在4小时内完成12M(这是我目前的测试设置),这是进步但远非理想
dt <- data.table(uri=rep("NA",count),
time=rep(0,count),
action=rep("NA",count),
bytes=rep(0,count),
dur=rep(0,count))
while (mongo.cursor.next(cursor)) {
b <- mongo.cursor.value(cursor)
set(dt, i, 1L, mongo.bson.value(b, "cache"))
set(dt, i, 2L, mongo.bson.value(b, "path"))
set(dt, i, 3L, mongo.bson.value(b, "time"))
set(dt, i, 4L, mongo.bson.value(b, …Run Code Online (Sandbox Code Playgroud) 由于MySQL让我疯狂,我试图让自己熟悉我的第一个"NoSQL"DBMS,它恰好是MongoDB.我通过rmongodb连接到它.
我使用rmongodb越多,运行高级查询就会遇到更多问题/问题.
首先介绍一些示例数据,然后再详细介绍我无法正确指定的不同类型的查询.
这个例子来自MongoDB网站,并且已经简化了一些.
pkg <- "rmongodb"
if (!require(pkg, character.only=TRUE)) {
install.packages(pkg)
require(pkg, character.only=TRUE)
}
# Connect to DB
db <- "test"
ns <- "posts"
mongo <- mongo.create(db=db)
# Insert document to collection 'test.users'
b <- mongo.bson.from.list(list(
"_id"="alex",
name=list(first="Alex", last="Benisson"),
karma=1.0,
age=30,
test=c("a", "b")
))
mongo.insert(mongo, "test.users", b)
# Insert document to collection 'test.posts'
b <- mongo.bson.from.list(list(
"_id"="abcd",
when=mongo.timestamp.create(strptime("2011-09-19 02:00:00",
"%Y-%m-%d %H:%M:%s"), increment=1),
author="alex",
title="Some title",
text="Some text.",
tags=c("tag.1", "tag.2"),
votes=5, …Run Code Online (Sandbox Code Playgroud) 我想知道连接MongoDB rmongodb与RMongo包之间的主要区别是什么R.这两个包的优点和缺点是什么?
我在R中有一个数据框,我试图将数据帧的每一行批量插入MongoDB中的单独文档.我能做的最接近的是使用以下脚本创建一个文档,并将dataframe行作为其子文档.
x <- toJSON(unname(split(score, 1:nrow(score))))
bson <- mongo.bson.from.JSON(x)
mongo.insert(mongo,'abc.abc',x)
Run Code Online (Sandbox Code Playgroud)
另一方面,我希望每行都是单独的文档.我也看到上面的方法非常快,但是如果我们绕着行循环,它会大大降低速度
我偶然发现了有关函数处理更新(mongo.update())的一些问题.
由于我还在熟悉MongoDB和rmongodb软件包,所以说明的问题很可能是由于我缺乏知识;-)
确保加载包
pkg <- "rmongodb"
lib <- file.path(R.home(), "library")
if (!suppressWarnings(require(pkg, lib.loc=lib, character.only=TRUE))) {
install.packages(pkg, lib=lib)
require(pkg, lib.loc=lib, character.only=TRUE)
}
Run Code Online (Sandbox Code Playgroud)
全局变量
db <- "__test"
ns.0 <- "user"
ns <- paste(db, ns.0, sep=".")
con <- mongo.create(db=db)
Run Code Online (Sandbox Code Playgroud)
确保emtpy DB
mongo.remove(mongo=con, ns=ns,
criteria=mongo.bson.from.list(lst=list(namefirst="John")))
Run Code Online (Sandbox Code Playgroud)
插入文件
fields <- list(namefirst="John", namelast="Doe")
b <- mongo.bson.from.list(lst=fields)
mongo.insert(mongo=con, ns=ns, b=b)
if (is.null(mongo.find.one(mong=con, ns=ns, query=b))) {
stop("Something went wrong")
}
Run Code Online (Sandbox Code Playgroud)
更新/升级文档
criteria <- list(namefirst="John", namelast="Smith")
fields <- list(namefirst="John", namelast="Smith", age=30) …Run Code Online (Sandbox Code Playgroud)