拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 根据物件阵列查找mongodb档案包含两个栏位

根据物件阵列查找mongodb档案包含两个栏位

白鹭 - 2022-03-02 2072 0 0

例子: Mongo db collection:

[
  {
    "user_id": 1,
    "lead_id": 901,
     ...
     ...
  },
  {
    "user_id": 2,
    "lead_id": 902,
     ...
     ...
  },
   {
    "user_id": 2,
    "lead_id": 903,
    ...
    ...
  },
 {
    "user_id": 3,
    "lead_id": 999,
    ...
    ...
  },
]

我有一个物件阵列:

const reqArr = [
  {
    "user_id": 1,
    "lead_id": 901,
  }, 
   {
    "user_id": 2,
    "lead_id": 999,
   }
]

我想基于这两者来查询数据库user_id并存lead_id在于阵列中的每个物件中reqArr像这样的东西或聚合管道

Model.find(reqArr)

我想要的输出是这样的:

[{
 "user_id": 1,
 "lead_id": 901,
  ...
  ...
}]

我只知道如何基于一个栏位的阵列进行查询,例如Model.find({_id: {"$in": [array of ids ]}})物件阵列中的多个栏位,但不知道。有什么想法或解决方法可以实作上述输出或否定上述输出?我只需要reqArrdb 集合中存在哪些物件,哪些不存在。谢谢你。

uj5u.com热心网友回复:

简单的 $or

db.collection.aggregate([
  {
    "$match": {
      "$or": [
        {
          "user_id": 1,
          "lead_id": 901
        },
        {
          "user_id": 2,
          "lead_id": 902
        }
      ]
    }
  }
])

mongoplayground


节点

const reqArr = [
  {
    "user_id": 1,
    "lead_id": 901,
  }, 
   {
    "user_id": 2,
    "lead_id": 999,
   }
]
Model.find({ "$or": reqArr})

uj5u.com热心网友回复:

执行上述操作的最简单方法是:

const results = await Promise.all(reqArr.map(req => {
    const { user_id, lead_id } = req;
    return Model.findOne({ user_id, lead_id });
}));

我们映射reqArr. 对于每个项目 ( req),我们将其分解为两个变量user_idlead_id

然后我们查询单个档案(我假设每个user_idlead_id对只有一个档案,否则需要稍微调整。

然后我们回传findOne承诺,产生一系列承诺,我们将其传入Promise.all以异步等待它们。

这应该会产生lead_iquser_id.reqArr

如果其中一些组合不存在于数据库中,则阵列的这些元素将存在undefined,您可以继续处理这些组合,但您需要。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *