当前位置: 首页 > 知识库问答 >
问题:

Mongo集团和推送:推送所有领域

澹台志诚
2023-03-14

有没有一种简单的方法可以“$推送”文档的所有字段?例如:

假设我有一本Mongo藏书:

{author: "tolstoy", title:"war & peace", price:100, pages:800}
{author: "tolstoy", title:"Ivan Ilyich", price:50,  pages:100}

我想按作者对它们进行分组-对于每个作者,列出他的整本书对象:

{ author: "tolstoy",
  books: [
     {author: "tolstoy", title:"war & peace", price:100, pages:800}
     {author: "tolstoy", title:"Ivan Ilyich", price:50,  pages:100}
  ]
}

我可以通过显式推送所有字段来实现这一点:

{$group: {
     _id: "$author",
     books:{$push: {author:"$author", title:"$title", price:"$price", pages:"$pages"}},
}}

但是有没有什么捷径,比如:

// Fictional syntax...
{$group: {
    _id: "$author",
    books:{$push: "$.*"},
}}

共有3个答案

房新翰
2023-03-14

如果问题是您不想显式写入所有字段(如果您的文档有许多字段并且您最终需要所有字段),您也可以尝试使用Map-Reduce执行此操作:

db.books.mapReduce(
    function () { emit(this.author, this); },
    function (key, values) { return { books: values }; },
    { 
        out: { inline: 1 },
        finalize: function (key, reducedVal) { return reducedVal.books; } 
    }
) 
高鸿振
2023-03-14

事实上,你根本无法实现你所说的,你需要$放松

db.collection.aggregate([
    {$unwind: "$books"},

    {$group: {
         _id: "$author",
         books:{$push: {
             author:"$books.author",
             title:"$books.title",
             price:"$books.price",
             pages:"$books.pages"
         }},
    }}
])

这就是在聚合中处理数组的方式。

而且,您想要的快捷方式键入所有字段的功能还不存在。

但具体来说,由于您必须做的事情,您无论如何都不能这样做,因为您在某种程度上正在重塑文档。

荣晨朗
2023-03-14

您可以使用$$根目录

{ $group : {
            _id : "$author",
            books: { $push : "$$ROOT" }
        }}

在这里可以找到:如何使用mongodb聚合和检索整个文档

 类似资料:
  • 推送原理 现阶段小能SDK推送服务仅支持友盟推送SDK,若要集成推送功能,请选择以下方案进行集成: 使用友盟推送SDK对接 请先集成友盟推送的SDK,友盟iOS版本SDK集成指南链接地址为:https://developer.umeng.com/docs/66632/detail/66734。 1、友盟集成接口使用说明 2、小能集成接口使用说明 3、友盟后台注册完成后,需将App应用信息页面获取的

  • 推送针对用户锁屏、退到后台等场景给用户通知,提醒用户收到了未读消息。

  • 一、基础配置 第一步:创建个推账号 如没有个推账号,需要创建个推推送账号及应用,获得AppID、AppKey和Master Secret 参数。如下图所示: 第二步:在智能触达中配置个推账号 在诸葛「智能触达→设置→触达渠道→推送消息」中,找到「个推推送」,填入上一步中得到的AppKey和Master Secret参数并完成开通。 第三步:确认SDK中添加推送逻辑代码 按照个推最新的开发文档集成时

  • (要求Workerman版本>=3.3.0) 基于Worker的多进程(分布式集群)推送系统,集群群发、集群广播。 start_channel.php 整个系统只能部署一个start_channel服务。假设运行在192.168.1.1。 <?php use WorkermanWorker; require_once __DIR__ . '/Workerman/Autoloader.php'; r

  • http://Socket.io允许你触发或响应自定义的事件,除了connect,message,disconnect这些事件的名字不能使用之外,你可以触发任何自定义的事件名称。 服务器端 // 注意,io(<端口号>) 将为你创建一个http服务。 var io = require('socket.io')(80); io.on('connection', function (socket)

  • 如何使用Firebase向我的应用程序的所有注册用户发送推送通知?我在纪录片中搜索了api,但没有找到任何有用的东西。