如何遍历一个集合并使用每个值更新另一个集合中的文档数组?

时间:2019-08-12 07:49:56

标签: arrays mongodb

我再次编辑了这个问题。 这似乎可行,但是我应该使用Promise还是async / await? 当我在较大的代码段中使用此代码时,似乎存在一些异步问题。我很重视建议。

我正在使用express.js和mongoose以及一个MongoDB数据库。

我有2个集合-一个客户集合和一个产品集合。

产品集合还具有“ 订单”数组以及一些产品详细信息(名称,代码,库存和价格),其中包含任何当前的详细信息(客户ID,订购数量和订购日期)该产品的订单。

我正在尝试创建一个将查看特定产品的更新,并为没有没有该产品的当前订单的所有客户创建/推送该产品的新订单。

通过遍历客户集合,并针对每个客户检查产品集合中是否有我想要的特定产品代码的订单,我设法做到了。如果没有该客户的现有订单,则将新订单推送到订单数组中;如果有现有订单,我什么都不做-然后继续检查下一位客户,等等。

尽管我的代码有效,但我还是MongoDB的新手,在我看来,可能有更优雅的方法来实现这一目标。因此,我欢迎您提出建议和意见。

这是客户收集模式:

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

// Create schema
const CustomerSchema = new Schema({
 name:{
  type: String
 },
 customerCode:{
  type: String
 },
 address:{
  type: String
 },  
 phone: {
  type: String
 }
});

mongoose.model('customers', CustomerSchema);

这是引用客户集合的产品集合架构:

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

// Create schema
const ProductSchema = new Schema({
  name:{
    type: String,
    required: true
  },
  productCode:{
    type: String,
    required: true
  },
  stock:{
    type: Number
  },  
  price: {
    type: Number
  },
  order:{
    [
      {
        customer:{
          type: Schema.Types.ObjectId,
          ref: 'customers'
        },
        quantity:{
          type: Number
        },
        orderDate:{
          type: Date,
          default: Date.now
        }
      }
    ]
  }
});

mongoose.model('products', ProductSchema);

这是我要更新的特定产品文档的简单示例。您可以看到2个客户当前有该产品的订单。我的更新代码需要为所有其他客户添加数量= 1的订单。

"_id" : ObjectId("5d4fd81f7c08ae0efa96b762"),
"name" : "Paper 180gsm white bond",
"productCode" : "P180120",
"stock" : 100,
"price" : 14.99,
"order" : [
    {
        "customer" : ObjectId("5d4fd6f37c08ae0efa96b75c"),
        "quantity" : 2,
        "orderDate" : ISODate("2019-08-12T23:56:45.238Z")
    },
    {
        "customer" : ObjectId("5d4fd6f37c08ae0efa96b75e"),
        "quantity" : 2,
        "orderDate" : ISODate("2019-08-12T23:56:45.238Z")
    }
]

这是我的代码。它可以工作,但是我认为它可能不必要地复杂,一点也不优雅。

// Get a cursor with all customers
Customer.find({})
.then (theseCustomers => {

    // Iterate over the customers using forEach
    theseCustomers.forEach((thisCustomer) => {

    // Look in the Product collection for a document
    // that has the specific product code AND an order for this customer
    Product.findOne({productCode: "P180120", "order.customer": thisCustomer._id})
    .then (thisProduct => {

      if(thisProduct === null) {
        // No order exists for this customer, so add it and save
        Product.findOne({productCode: "P180120"})
        .then(record => {
          record.order.push({customer: thisCustomer._id, quantity: 1});
          record.save()
          .then(() => {
            console.log("New order added");
          })
        .catch(err => {
          console.log("Error saving new order");
        });
      });

    } else {
      // An order already exists for this customer, so do nothing
      }
    })
  })
})

0 个答案:

没有答案