【问题标题】:Add/Merge element from from one Object to another Object inside array将元素从一个对象添加/合并到数组内的另一个对象
【发布时间】:2019-05-03 12:09:27
【问题描述】:

我的异步函数中有以下代码

async function test () {
    try {
        const aucs = await auctions.find({owner: 'owner', place: 'place'}).limit(15);
        const item = await Promise.all(aucs.map(async aucs => {
            const map = await items.find({id: aucs.item});
            return map[0]
        }));
        --->we are here [1]
    } catch (err) {
        console.log(err);
    }
}

test();

还有点 [1] 我有两个可用的数组,其中包含另一个对象(都是来自 Mongo 的响应),它们是:

aucs = [ { _id: 5c00faa4936359120ceb3632,
    auc: 177215422,
    item: 130251,
    price: 26000000,
    lastModified: 1543567955000,
    date: 2018-11-30T08:53:56.290Z,
    __v: 0 },
    { _id: 5c00faa4936359120ceb363f,
    auc: 177215440,
    item: 130251,
    price: 26000000,
    lastModified: 1543567955000,
    date: 2018-11-30T08:53:56.290Z,
    __v: 0 },... ]

item = [ { _id: 5bcd8a6134cdd1223cd3239b,
    id: 130251,
    name: 'TEST_NAME_1',
    __v: 0 },
    { _id: 5bcd8a6134cdd1223cd3239b,
    id: 130252,
    name: 'TEST_NAME_2',
    __v: 0 },...]

我想添加到 aucs[i]aucs 中的每个元素,item[i].name (name: 'TEST_NAME_1') 喜欢:

combined = [ { _id: 5c00faa4936359120ceb3632,
        auc: 177215422,
        item: 130251,
        name: 'TEST_NAME_1',
        price: 26000000,
        lastModified: 1543567955000,
        date: 2018-11-30T08:53:56.290Z,
        __v: 0 },...]

我正在尝试将for 循环与auc[i].name = item[i].name 一起使用或使用aucs.push(),但由于某些未知原因,它对我不起作用。 我收到.push is not a function 的错误,而 for 循环没有添加任何内容。那么也许有人有任何想法?

注意:1

实际上解决了 item 的一个问题,mongo 在数组内返回数组,如[ [ { ...} ] ],所以我应该使用 return map[0] 来修复它。

注意:2

根据 typeof,aucs 和 item 都是对象,并且有 .length 选项(它们的长度相同,应该一直都是。所以它们不是承诺

注意:3

let merged = {...aucs, ...item};回复我

{ '0': { _id: 5bcd8a6134cdd1223cd3239b,
     id: 130251,
     name: 'JewelCraft',
     icon: 'inv_jewelcrafting_70_jeweltoy',
     stackable: 1,
     isAuctionable: true,
     __v: 0 }...

但不是我需要的

【问题讨论】:

  • 我建议不要在 cmets 中添加信息,而是更新问题本身(使用“编辑”)。

标签: javascript arrays mongodb mongoose ecmascript-6


【解决方案1】:

如果我理解正确,目标是创建一个新的 aucs 集合,就像找到的集合一样,每个更新都包含来自 item 集合的项目名称,其中项目具有匹配的 id。

let aucs = [ { _id: "5c00faa4936359120ceb3632",
    auc: 177215422,
    item: 130251,
    price: 26000000,
    lastModified: 1543567955000,
    date: "2018-11-30T08:53:56.290Z",
    __v: 0 },
    { _id: "5c00faa4936359120ceb363f",
    auc: 177215440,
    item: 130251,
    price: 26000000,
    lastModified: 1543567955000,
    date: "2018-11-30T08:53:56.290Z",
    __v: 0 } ];
 
item = [ { _id: "5bcd8a6134cdd1223cd3239b",
    id: 130251,
    name: 'TEST_NAME_1',
    __v: 0 },
    { _id: "5bcd8a6134cdd1223cd3239b",
    id: 130252,
    name: 'TEST_NAME_2',
    __v: 0 }];
    
// create a new collection of aucs modified to include the names of matching items
let combined = [];
aucs.forEach(auc => {
    let combinedAuc = Object.assign({}, auc);
    combined.push(combinedAuc);
    let matchingItem = item.find(i => auc.item === i.id);
    if (matchingItem) combinedAuc.name = matchingItem.name
});

console.log(combined)

【讨论】:

  • 可以不使用underscore吗?似乎它工作正常,但我正在尝试不添加模块。那么_.method 是否代表array.prototype
  • 编辑为不带下划线显示。这对于其他东西来说也是一个有用的库。
【解决方案2】:

如果你在这里使用一些聚合技巧会更好更快

auctions.aggregate([
  { "$match": { "owner": "owner", "place": "place" }},
  { "$lookup": {
    "from": "items",
    "let": { "item": "$item" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$id", "$$item"] }}}
    ],
   "as": "item"
  }},
  { "$limit": 15 }
])

【讨论】:

  • 它适用于两个系列吗?我同时使用了itmesauctions。如我所见,这里只有auctions 收藏。
  • 是的,它会起作用的。请参阅 $lookup 聚合中的 from 部分。你可以在那里看到items。它将带来与id匹配的所有items
  • 你应该阅读更多关于它的信息here
猜你喜欢
  • 2017-01-12
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 2019-03-12
相关资源
最近更新 更多