javascript - 在 mongodb 中使用外部引用进行聚合

标签 javascript mongodb

我想在 mongodb 查询中聚合结果,但是在像来自 mongodb.org 的以下示例建模的情况下我无法完成此操作:

{
   _id: "oreilly",
   name: "O'Reilly Media",
   founded: 1980,
   location: "CA"
}

{
   _id: 123456789,
   title: "MongoDB: The Definitive Guide",
   author: [ "Kristina Chodorow", "Mike Dirolf" ],
   published_date: ISODate("2010-09-24"),
   pages: 216,
   language: "English",
   publisher_id: "oreilly"
}

{
   _id: 234567890,
   title: "50 Tips and Tricks for MongoDB Developer",
   author: "Kristina Chodorow",
   published_date: ISODate("2011-05-06"),
   pages: 68,
   language: "English",
   publisher_id: "oreilly"
}

我的结果应该有这样的结构:

{
    publishers: [
    {
        _id: "oreilly",
        name: "O'Reilly Media",
        founded: 1980,
        location: "CA"
        books: [
            {
                 _id: 123456789,
                 title: "MongoDB: The Definitive Guide",
                 author: [ "Kristina Chodorow", "Mike Dirolf" ],
                 published_date: ISODate("2010-09-24"),
                 pages: 216,
                 language: "English"
            },
            {
                 _id: 234567890,
                 title: "50 Tips and Tricks for MongoDB Developer",
                 author: "Kristina Chodorow",
                 published_date: ISODate("2011-05-06"),
                 pages: 68,
                 language: "English",
                 publisher_id: "oreilly"
             }
        ]
        }        
    ]
}

但我无法设法在 books 表上使用 $aggregate 查询来填充出版商引用,我什至不知道这是否可能。

获得这种结果的正确策略是什么?

最佳答案

获得结果的一种方法是通过迭代每个出版商来查找他的书然后构造您的结果来模拟连接:)

mongo shell 中的示例:

var publishers = []; 
var struct = {};
struct.publishers = publishers
db.publisher.find().forEach( function(publisher) {        
        publisher.books = db.books.find({publisher_id: publisher._id}).toArray()
        publishers.push(publisher)
})
printjson(struct)

驱动程序示例:

您可以使用 db.evalServer-side Javascript 运行查询.

数据库评估: connection.db.eval(function construct(publisher){return struct}), arg ,function (e, result) {result});
db.eval 函数:

db.eval(function construct(publisher) {
    var publishers = []; 
    var struct = {};
    var query = publisher ? {_id:publisher} : {}
    struct.publishers = publishers
    db.publisher.find(query).forEach( function(publisher) {
        publisher.books = db.books.find({publisher_id: publisher._id}).toArray()
        publishers.push(publisher)
    })
return struct
}
,null // argument to pass into function for filter, e.g. 'oreilly'
,{nolock:true})

Mongoose 示例:(在集合名称簿上)

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/book');
mongoose.connection.on('connected', function() {
  mongoose.connection.db.eval(function construct(publisher) {
      var publishers = [];
      var struct = {};
      var query = publisher ? {_id:publisher} : {}
      struct.publishers = publishers
      db.publisher.find(query).forEach( function(publisher) {
          publisher.books = db.books.find({publisher_id: publisher._id}).toArray()
          publishers.push(publisher)
      })
  return struct
  }
  ,'oreilly'
  ,{nolock:true}, function(e,result) {
    if(e) console.log(e);
    console.log(JSON.stringify(result));
  })
})

关于javascript - 在 mongodb 中使用外部引用进行聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28474468/

相关文章:

javascript - Node.js - 使用回调插入 MongoDB

javascript - 如何使用 MongoDB 和 Jade (Express.js) 通过 _id 删除文档?

javascript - 单击时添加背景颜色

javascript - element.css ('filter' ) 在 jQuery 1.8 中返回 undefined

node.js - Mongoose 查询 : compare two values on same document

javascript - 错误处理 promise 在 mongoDB 中保存唯一数据(ValidationError)

mongodb - 如何获得总和的总和拆分,这也是mongoDB中项目的总和

javascript - 如何在滚动后显示固定但如果屏幕小于则隐藏它

javascript - Swiper slider 不会为 slider 布局加载多个 View

javascript - 删除/重新加载已加载的脚本