【问题标题】:How to join collection in Mongodb using node.js?如何使用 node.js 在 Mongodb 中加入集合?
【发布时间】:2017-03-28 22:42:22
【问题描述】:

我正在使用 node.js 进行 mongodb 连接查询,我有两个集合,我想加入两个集合并想要填充数据。

饮品系列

[{
  "_id": "580a2f7615a0161010a23bfg",
  "name": "Pepsi",
  "createDate": "2016-10-21T15:08:27.405Z"
 }, {
  "_id": "580a2f7615a0161010bge345",
  "name": "Mirinda",
  "createDate": "2016-10-21T15:08:27.405Z"
 }, {
  "_id": "580a2f7615a0161010vbgdt5",
  "name": "Coke",
  "createDate": "2016-10-21T15:08:27.405Z"
 }, {
  "_id": "580a2f7615a0161010vb9876",
  "name": "Thums Up",
  "createDate": "2016-10-21T15:08:27.405Z"
 }, {
  "_id": "580a2f7615a0161010vbgmnk9",
  "name": "Slice",
  "createDate": "2016-10-21T15:08:27.405Z"
}]

订单收集

[{
  "_id": "580fa9a92bb22e783b298798",
  "created_at": "2016-10-25T18:41:53.716Z",
  "tab": [{
      "created_at": "2016-10-26T00:21:33.100Z",
      "cost": 30,
      "quantity": 7,
      "name": "Mirinda"
 }]
 }, 
 {
   "_id": "580fa9a92bb22e783b29887h",
   "created_at": "2016-10-25T18:41:53.716Z",
   "tab": [{
       "created_at": "2016-10-26T00:21:33.100Z",
       "cost": 25,
       "quantity": 5,
       "name": "Pepsi"
    }]
}]

所以我想通过加入 Drinks 集合来找到 Order 集合的名称。

订单架构

var mongoose = require("mongoose");

var OrderSchema = new mongoose.Schema({
   tab: [{
       quantity: Number,
       cost: Number,
       name: {
          type: String
       },
       created_at: {
          type: Date
       }
    }],
});
module.exports = mongoose.model("Order", OrderSchema);

饮品架构

var mongoose = require('mongoose'),
utilities = require('../config/utilities');

var DrinkSchema = mongoose.Schema( {
   drinks_name: { type: mongoose.Schema.Types.ObjectId, ref: 'Order'    },
   name: {
     type: String
   },
   id: {
     type: String
   },
   createDate: {
     type: String
   },
})
module.exports = mongoose.model("Drinks", DrinkSchema);

Node.js 代码

var Drinks = require("../models/drinks"),
Orders = require("../models/orders"),
async = require('async'),
mongoose = require('mongoose');

exports.getOrdersList = function(req, res) {

   //How to Join Drinks and Orders Collection ?
   Drinks
   .find({})
   .populate('drinks_name', 'tab.name')
   .exec(function (err, result) { 
      console.log('The Drinks List is', result);
   });
}

请仔细阅读我上面的帖子,如果您有任何解决方案,请告诉我。

【问题讨论】:

  • 我不确定 MongoDB 中是否有任何允许连接的内置功能。
  • 嘿,我猜聚合查询会起作用
  • 通过代码执行连接或检查猫鼬引用和人口。
  • @My Chat:您是否正在寻找使用订单查找填充饮料名称?
  • @My Chat : 我发布了答案检查...

标签: node.js mongodb collections


【解决方案1】:

您无法在 MongoDB 中进行连接,因为它是一个 NoSQL 数据库。我的理解是,您想根据“订单”的名称字段从“饮料”中检索数据。您可以做的是为您的 Orders 集合中的每个文档找到“tab.name”字段,然后从您的 Drinks 集合中找到它的“_id”字段。

Orders.find({"tab.name":"Mirinda"});
Drinks.find({"name":"Mirinda"}), { "_id" : 1", "created_at":1});

然后,您可以连接两个结果,或多或少地得到您想要的。

【讨论】:

  • 官方没有加入,但当他使用猫鼬时,他可以使用填充选项..但他正在寻找数据类型数组的填充。
  • @BEJGAMSHIVAPRASAD 嘿,谢谢,是的,我正在寻找填充查询,你能帮我吗?
  • 我已经使用了填充但.. 没有尝试使用数组对象.. 我会检查并更新你..
【解决方案2】:

MongoDB 本身不支持联接,但我们可以通过两种不同的方式实现联接方法:

  • 嵌入对象(将引用对象嵌入文档本身)
  • 在引用文档中存储引用对象的_id。

如果您使用 mongoose ODM 创建了架构,则可以使用

获取引用对象

Drinks.find({}).populate('orders').exec(cb).

================================

这里对订单和饮料的架构进行了轻微更改。您不需要有一个成本字段,因为它可以根据每种饮料的数量来计算。也找到填充查询。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var Orders = new Schema({
    waiter: {type: String},
    table:  {type: Number},
    items: [
        {
            quantity: {type: Number, default: 1 },
            drink_id: {type: mongoose.Schema.Types.ObjectId, ref: 'Drinks'}
        }
    ],
    billed: false,
    timestamp : {
        createdAt: created_at,
        updatedAt: updated_at
    }
})

module.exports = mongoose.model('Order', Orders);


var Drink = new Schema({
    name: {type: String, required: true},
    cost: {type: Number, required: true}
    discount: { type: Number},
    timestamps: {
        createdAt: created_at,
        updatedAt: updated_at
    }
})


module.exports = mongoose.model('Drink', Drink);


============

For Querying : 

var Orders  = require('./Orders.js');

Orders.find({}).populate('drinks').exec(function(err, documents){
    // you will get drinks object in response 
})

如果特定订单的数量被更新以反映在订单中,您将必须编写更新订单的查询,并且您可以使用聚合框架来计算特定表上订单的成本。

【讨论】:

  • @MyChat 关于更新饮料数量的最后一点,您可以在 mongo 上使用 $in 运算符找到
  • @MyChat my bad $in 不起作用,但 $elemMatch 会在对象数组中进行搜索
【解决方案3】:

看来您的问题是错误的...您需要获取订单信息以及商品,但商品名称应从饮料集合中填充..

订单架构:

var mongoose = require("mongoose");
var ObjectId = mongoose.Schema.Types.ObjectId;

var OrderSchema = new mongoose.Schema({
   tab: [{
      itemId:{
        type: ObjectId,
        ref: 'Drinks',
        required: true
      },
       quantity: Number,
       cost: Number,
       created_at: {
          type: Date,
          default:Date.now
       }
    }],
     created_at: {
          type: Date,
          default:Date.now
       }

});
module.exports = mongoose.model("Order", OrderSchema);

饮品架构

var mongoose = require('mongoose');
var DrinkSchema = mongoose.Schema({
   drinks_name: { type: mongoose.Schema.Types.ObjectId, ref: 'Order'},
   name: {
     type: String
   },
   createDate: {
     type: Date,
     default: Date.now
   },
});
module.exports = mongoose.model("Drinks", DrinkSchema);

~
节点代码:

var Drinks = require("./drinks"),
Orders = require("./orders"),
mongoose = require('mongoose');
/* mongoose.connect('mongodb://connectionsrint'); */
   //How to Join Drinks and Orders Collection ?
   Orders
   .find({_id:'582ae63967190c92552f871b'})
   .populate('tab.itemId')
   .exec(function (err, result) {
    console.log(JSON.stringify(result));
   });

输出

[{"_id":"582ae63967190c92552f871b","__v":0,"created_at":"2016-11-15T10:40:57.256Z","tab":[{"itemId":{"_id":"582ae4988bd47efe54bc5282","name":"Pepsi","__v":0,"createDate":"2016-11-15T10:34:00.115Z"},"quantity":5,"cost":125,"_id":"582ae63967190c92552f871c","created_at":"2016-11-15T10:40:57.262Z"}]}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 2018-08-21
    • 2018-06-23
    • 2016-06-19
    • 1970-01-01
    • 2017-08-10
    • 2021-11-04
    相关资源
    最近更新 更多