当其他集合已存在时,如何在集合中插入

时间:2016-06-17 17:22:32

标签: mongodb nosql

我是noSQL数据库的新手。我已经开始使用noSQL中的mongodb数据库了。到目前为止,我使用了mySQL和MS SQL Server。我知道如何在它们之间创建表和关系。但是这个noSQL概念完全不同于此。所以,我在问这个问题。我希望我能早点学习使用noSQL数据库。

我在mongodb中使用了以下查询来创建集合并在其中插入数据:

db.createCollection('Parties');
db.parties.insert({partyName:"Best Sellers", mobileNo:"9876543214"});
db.parties.insert({partyName:"National Traders", mobileNo:"9876543215"});
db.createCollection('items');
db.items.insert({itemName:"Item-A", size:"12"});
db.items.insert({itemName:"Item-B", size:"8"});
db.createCollection('orders');

视觉上,我的订单将包含以下字段:

Order No     : AB/123
Date of Order: 17-06-2016
Party Name   : National Traders // It will be a select

Item Name           Quantity        Rate         Amount
--------------------------------------------------------
Item-A //Select        200           20           4000
Item-B //Select        100           30           3000
--------------------------------------------------------
                       300                        7000              

我的问题是:

如何查询mongodb以便在订单集合中插入?我从未使用嵌套集合之类的东西。 anybosy可以举个例子吗?

更新

以下是关系数据库中我的数据库的图表:

enter image description here

如何将其转换为mongodb样式??

UPDATE2:

我尝试在Node.js中为模型顺序添加此代码:

var mongoose = require('mongoose');

var orderSchema = new mongoose.Schema({
  salesOrderId: String,
  orderDate: Date,
  party: {type: Schema.Types.ObjectId, ref:'Party'},
  items:[{{type: Schema.Types.ObjectId, ref:'Item'}, quantity: Number, rate: Number}],
  dispatches:{
    invoiceId: Number,
    dispatchDate: Date,
    items: [{{type: Schema.Types.ObjectId, ref:'Item'}, quantity: Number, rate: Number}]
  }
});

mongoose.model('Order', orderSchema);

2 个答案:

答案 0 :(得分:1)

MongoDB不遵循关系数据库数据结构。 将SQL数据结构复制到MongoDB并不是使用MongoDB的理想方式。应修改您的应用程序以使用MongoDB样式的数据结构。

对于存储订单数据,我建议只使用一个包含整个订单数据的集合。

{ 
   orderNumber : 7283,
   party : {partyName:"Best Sellers", mobileNo:"9876543214"},
   items : [
       {itemName:"Item-A", size:"12"},
       {itemName:"Item-B", size:"8"},
       .....
   ]
   orderDate : <>,
   total : <>,
   status : <>,
   .....
}

答案 1 :(得分:1)

这个问题需要三个集合:

  1. 项目 - 将保存项目数据
  2. 派对 - 将举行派对数据
  3. 将保存所有相关数据的订单

    image

  4. 当聚会下订单时,我们正在创建文档并在其中放置一些子文档:

    1. Order数据(ID,日期等)
    2. PartyDetails - 来自party collection
    3. 的整个文档
    4. Items - 包含按方选择的所有项目的数组(详情,数量,费率等)
    5. DispatchDispatchDetails - 这些取决于商品的运送方式
    6. 这种结构实用程序有效地面向文档的存储,每次你需要检查订单状态时,你只需要一个文档,你就可以一次性获得子文档。

      在此类集合中插入数据取决于您将使用的应用程序语言,但我认为这个答案将为您提供文档数据库解决方案的强大功能。

      欢迎任何评论!

      *编辑*

      var itemToInsertA = db.items.find({"itemName" : "Item-A"}).toArray()
      var itemToInsertB = db.items.find({"itemName" : "Item-B"}).toArray()
      var party = db.parties.find({"partyName" : "National Traders"}).toArray()
      
      var order = {
          //_id - will be assigned by db - but we can do it mannually
          orderDate : new Date(), // now
          salesOrderId : "Need to provide this from sale now or later",
          PartyDetails : party[0],
          Items : [{
                  item : itemToInsertA[0],
                  Quantity : 200,
                  Rate : 20,
                  ValueAtTransactionDate : 4000
              }, {
                  item : itemToInsertB[0],
                  Quantity : 100,
                  Rate : 30,
                  ValueAtTransactionDate : 3000
              }
          ]
      }
      
      db.orders.insertOne(order)
      

      所以我们的订单看起来像这样:

      {
          "_id" : ObjectId("5767d030ecf8248c30af068c"),
          "orderDate" : ISODate("2016-06-20T11:14:56.372Z"),
          "salesOrderId" : "Need to provide this from sale now or later",
          "PartyDetails" : {
              "_id" : ObjectId("5767ce26ecf8248c30af0686"),
              "partyName" : "National Traders",
              "mobileNo" : "9876543215"
          },
          "Items" : [ 
              {
                  "item" : {
                      "_id" : ObjectId("5767ce26ecf8248c30af0687"),
                      "itemName" : "Item-A",
                      "size" : "12"
                  },
                  "Quantity" : 200.0,
                  "Rate" : 20.0,
                  "ValueAtTransactionDate" : 4000.0
              }, 
              {
                  "item" : {
                      "_id" : ObjectId("5767ce26ecf8248c30af0688"),
                      "itemName" : "Item-B",
                      "size" : "8"
                  },
                  "Quantity" : 100.0,
                  "Rate" : 30.0,
                  "ValueAtTransactionDate" : 3000.0
              }
          ]
      }
      

      创建一个图表我将plantUML与QEditor一起使用。

      plantumpl dump

      @startuml
      
      package "Party"{
      [PartyId]
      [PartyCode]
      [PartyName]
      [MobileNumber]
      }
      
      package "Item"{
      [ItemId]
      [ItemCode]
      [ItemName]
      }
      
      package "Order"{
      [OrderId]
      [SalesOrderId]
      [OrderDate]
      
      
      
      node "Dispatch"{
      [InvoiceId]
      [SalesInvoiceId]
      [DateOfDispatch]
      
      }
      
      node "DispatchItemTransaction"{
      [DispatchItemTId]
      [Quantity.]
      [Rate.]
      [ItemId.]
      [InvoiceId.]
      }
      
      component PartyDetails
      node "Items"{
      component ItemDetails
      [Quantity]
      [Rate]
      [Value]
      }
      
      
      }
      
      
      Item -> ItemDetails
      ItemDetails-->ItemId.
      Party -down-> PartyDetails
      @enduml