使用 rmongodb 在 R 中运行高级 MongoDB 查询

2023-11-27

由于 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,
        voters=c("jane", "joe", "spencer", "phyllis", "li"),
        comments=list(
            list(
                who="jane", 
                when=mongo.timestamp.create(strptime("2011-09-19 04:00:00",
                    "%Y-%m-%d %H:%M:%s"), increment=1),
                comment="Some comment."
            ),
            list(
                who="meghan", 
                when=mongo.timestamp.create(strptime("2011-09-20 13:00:00",
                    "%Y-%m-%d %H:%M:%s"), increment=1),
                comment="Some comment."
            )
        )
    )
)
b
mongo.insert(mongo, "test.posts", b)

与插入 JSON/BSON 对象相关的两个问题:

  1. 文档“test.posts”,字段voters: 使用正确吗c()在这种情况下?
  2. 文档“test.posts”,字段comments:指定这一点的正确方法是什么,c() or list()?

顶级查询:它们很有效

顶级查询工作得很好:

# Get all posts by 'alex' (only titles)
res <- mongo.find(mongo, "test.posts", query=list(author="alex"), 
    fields=list(title=1L))
out <- NULL
while (mongo.cursor.next(res))
    out <- c(out, list(mongo.bson.to.list(mongo.cursor.value(res))))

> out
[[1]]
                       _id                      title 
                     "abcd"            "No Free Lunch" 

问题1:基本的子级别查询

如何运行需要到达任意深度子级别的简单“子级别查询”(而不是顶级查询)JSON/BSON样式 MongoDB 对象?这些子级查询利用 MongoDB点符号我似乎不知道如何将其映射到有效的rmongodb query

在简单的 MongoDB 语法中,类似

> db.posts.find( { comments.who : "meghan" } )

会工作。但我不知道如何做到这一点rmongodb功能

这是我到目前为止尝试过的

# Get all comments by 'meghan' from 'test.posts'

#--------------------
# Approach 1)
#--------------------
res <- mongo.find(mongo, "test.posts", query=list(comments=list(who="meghan")))
out <- NULL
while (mongo.cursor.next(res))
    out <- c(out, list(mongo.bson.to.list(mongo.cursor.value(res))))

> out
NULL
# Does not work

#--------------------
# Approach 2) 
#--------------------
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.object(buf, "comments")
mongo.bson.buffer.append(buf, "who", "meghan")
mongo.bson.buffer.finish.object(buf)
query <- mongo.bson.from.buffer(buf)
res <- mongo.find(mongo, "test.posts", query=query)
out <- NULL
while (mongo.cursor.next(res))
    out <- c(out, list(mongo.bson.to.list(mongo.cursor.value(res))))

> out
NULL
# Does not work

问题2:查询使用$运营商

这些工作

Query 1

buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.object(buf, "age")
mongo.bson.buffer.append(buf, "$lte", 30)
mongo.bson.buffer.finish.object(buf)
criteria <- mongo.bson.from.buffer(buf)
criteria

> mongo.find.one(mongo, "test.users", query=criteria)
    _id : 2      alex
    name : 3     
        first : 2    Alex
        last : 2     Benisson

    karma : 1    1.000000
    age : 1      30.000000
    test : 4     
        0 : 2    a
        1 : 2    b

Query 2

buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.object(buf, "test")
mongo.bson.buffer.append(buf, "$in", c("a", "z"))
mongo.bson.buffer.finish.object(buf)
criteria <- mongo.bson.from.buffer(buf)
criteria
mongo.find.one(mongo, "test.users", query=criteria)

但是,请注意,原子集将导致返回值为NULL

mongo.bson.buffer.append(buf, "$in", "a")
# Instead of 'mongo.bson.buffer.append(buf, "$in", c("a", "z"))'

尝试同样的子级别查询我又迷路了

buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.object(buf, "name")
mongo.bson.buffer.start.object(buf, "first")
mongo.bson.buffer.append(buf, "$in", c("Alex", "Horst"))
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.finish.object(buf)
criteria <- mongo.bson.from.buffer(buf)
criteria <- mongo.bson.from.buffer(buf)
> criteria
    name : 3     
        first : 3    
            $in : 4      
                0 : 2    Alex
                1 : 2    Horst

> mongo.find.one(mongo, "test.users", query=criteria)
NULL

c() 或 list() 都可以。取决于组件是否已命名以及它们是否都具有相同的类型(对于列表)。最好的办法是查看生成的 BSON,看看是否得到了您想要的结果。为了最好地控制生成的对象,请使用 mongo.bson.buffer 以及对其进行操作的函数。事实上,这就是子查询失败的原因。 'comments' 被创建为子对象而不是数组。 mongo.bson.from.list() 很方便,但它不能为您提供相同的控制,有时它会猜测从复杂结构生成的内容是错误的。

对另一组数据的查询可以像这样更正:

buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.object(buf, "name.first")
mongo.bson.buffer.append(buf, "$in", c("Alex", "Horst"))
mongo.bson.buffer.finish.object(buf)
criteria <- mongo.bson.from.buffer(buf)

请注意,您肯定需要在此处使用缓冲区,因为 R 会因点分名称而阻塞。

我希望这能解决你的问题。如果您还有任何疑问,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 rmongodb 在 R 中运行高级 MongoDB 查询 的相关文章

随机推荐

  • git add --interactive“您编辑的块不适用”

    我正在尝试使用git add interactive有选择地向我的索引添加一些更改 但我不断收到 您编辑的大块不适用 再次编辑 消息 即使我选择 e 选项 我也会收到此消息 并立即保存 关闭我的编辑器 换句话说 如果根本不编辑该块 该补丁就
  • Rabbitmq Consumer_Timeout 行为未按预期工作?

    我很难证明consumer timeout设置正在按预期工作 我可能做错了或者误解了consumer timeout行为 我所有的测试代码都可以在这里找到 https github com Rafarel rabbitmq tests 基本
  • instance_eval 的块参数 - 已记录?目的?

    刚刚意识到instance eval yields self作为关联块的参数 1 9 2 版本中的错误除外 http www ruby forum com topic 189422 1 9 3p194 003 gt class C end
  • 如何从 LINQ to XML 中的 XElement 读取特定元素值

    我有一个XElement其中有这样的内容
  • HTML:如何创建“另存为”按钮?

    在浏览器中 当您想要保存当前正在查看的 HTML 页面时 通常会转到 文件 菜单并单击 另存为 我可以在 HTML 页面底部添加一个具有相同功能的小按钮吗 因此 我希望我的用户能够单击按钮将页面保存到磁盘上 而不是转到 文件 菜单 gt 另
  • EF Core 2.0 Identity - 添加导航属性

    在 EF Core 2 0 中 默认情况下不包含 Identity 导航属性 因此在升级后 我添加了它们 因此 对于用户和角色之间的多对多关系以及角色和 RoleClaim 之间的一对多关系 我添加了以下导航属性 public class
  • 如何扩展Spring注解@Transactional

    我必须在我的网络应用程序中使用 3 个不同的事务管理器 所以我根据以下内容编写了自己的注释弹簧参考 第 10 5 6 3 节自定义快捷方式注释 一个注释 用于使用一个特定的事务管理器 如下所示 import java lang annota
  • 使用 PHP 删除文件夹中的所有文件?

    例如 我有一个名为 Temp 的文件夹 我想使用 PHP 删除或刷新该文件夹中的所有文件 我可以这样做吗 files glob path to temp get all file names foreach files as file it
  • Numpy 融合乘法和加法以避免浪费内存

    是否可以将两个 ndarray A 和 B 相乘并将结果添加到 C 而无需为 A 乘以 B 创建一个大型中间数组 Numpy 对于 C A 乘 B 的情况有 out 关键字参数 numpy multiply A B out C C A 乘以
  • SQL Server SORT 顺序与 ASCII 代码顺序不对应

    我正在使用 SQL Server 2012 并且我有一个数据库SQL Latin1 General CP1 CI AS整理 create table testtable c nvarchar 1 null insert into testt
  • 通过 USB 安装应用程序 [安装被用户取消]

    我可以通过 USB 将应用程序安装到我的 Android 设备上 但是 当 Android 上显示允许 拒绝安装弹出窗口时 我错误地单击了 拒绝 并选中了 记住我的选择 现在 每次尝试通过 USB ADB 安装应用程序都失败并出现错误com
  • UrlHelper.GenerateUrl 的 ASP.NET MVC 公共替代方案

    我想在我的页面中嵌入一个指向控制器操作的链接 以便我可以从 javascript 使用它 就像是 var pollAction Mycontroller CheckStatus 现在我很高兴对其进行硬编码 但如果有一种可以用来创建 URL
  • python中的快速寻峰和质心

    我正在尝试用 python 开发一种快速算法 用于查找图像中的峰值 然后找到这些峰值的质心 我使用 scipy ndimage label 和 ndimage find objects 编写了以下代码来定位对象 这似乎是代码中的瓶颈 在 5
  • Pojo 到 xsd 生成

    是否有一个库可以从 java 类生成 xsd 模式 Google 产生了很多相反的结果 来自 xsd 的 java 类 JAXB 2 0 允许您从带注释的 Java 类创建 XML 模式 您可以在以下位置找到一些示例AMIS 博客并在Jav
  • 如何在 iOS 推送通知上增加徽章

    我目前正在从有效负载中获取徽章 但我怎样才能更新这个值 aps alert Notification Hub test notification2 badge 1 sound Default 当我发送此消息时 徽章编号中始终显示 1 但是当
  • 批处理参数 %~s1 给出了错误的 8.3 短名称

    我正在尝试在 Windows XP 中编写一个批处理文件 该文件接受完全限定的路径名 并输出 8 3 短名称版本 echo off echo s1 我遇到过一种特殊情况 它输出不正确的路径和文件 C gt test bat C Docume
  • Angular-ui + D3:如何实现上下文菜单(弹出框与模式)?

    给出以下用例 我使用 D3js 来渲染由 AngularJS 管理的对象 我想为 D3 图表添加交互性 当单击 svg 元素时 我希望有一种弹出菜单 允许修改对象属性 这些属性是 AngularJS 所必需的 但 D3 不会呈现 D3 An
  • sys.path 与 $PATH

    我想从 python 程序内部访问 PATH 变量 到目前为止我的理解是 sys path 给出了 Python 模块搜索路径 但我想要的是 PATH 环境变量 有没有办法从Python内部访问它 为了提供更多背景知识 我最终想做的是找出用
  • 为什么“using”作用域可以在 Start-Job 本地工作,但不能与 Invoke-Command 一起工作?

    为什么 PowerShell 不允许使用using使用时范围Invoke Command本地 根据文档 the using修饰符只能用于远程命令 去引用 从 PowerShell 3 0 开始 您可以使用Using范围修饰符来标识远程命令中
  • 使用 rmongodb 在 R 中运行高级 MongoDB 查询

    由于 MySQL 让我抓狂 我试图让自己熟悉我的第一个 NoSQL DBMS 而它恰好是MongoDB 我通过以下方式连接到它rmongodb 我玩得越多rmongodb 关于运行高级查询的疑问 问题就越多 首先 我先展示一些示例数据 然后