mongodb 如何使用嵌入文档数组和$elemMatch等在mongoose搜索查询中插入动态数据

t30tvxxf  于 2023-01-16  发布在  Go
关注(0)|答案(1)|浏览(115)

我对一组嵌入式文档使用多个$elemMatch查询,类似于下面所示:https://www.mongodb.com/docs/manual/tutorial/query-array-of-documents/#a-single-nested-document-meets-multiple-query-conditions-on-nested-fields
我正在为我的投资组合做一个附带项目,用户可以发布电影交易(他们拥有的假电影)。他们通过添加他们拥有的电影和他们可能寻求回报的电影来创建一个交易。
服务器将接收客户端发送的两个数组,他们提供的电影和他们寻找的电影。在下面的mongoose查询中,我希望不要太奇怪,它本质上检查数据库中与客户端交易相匹配的交易。每次用户删除/添加电影时都会执行此查询,因此取决于发送的内容,我想查询包含offering中的任何电影,并且还包括seeking中的任何移动的文档(交易)。
本例中的每个文档都是一个单独的电影交易,它包含2个嵌入文档数组offeringseeking

const movieTrades = await Trade.find({
        $and: [
          {
            $or: [
              {
                offering: { $elemMatch: {} },
              },
              {
                offering: { $elemMatch: { name: "lion king" } },
              },
            ],
          },
          {
            $or: [
              {
                seeking: { $elemMatch: { name: "lego movie" } },
              },
              {
                seeking: { $elemMatch: { name: "nemo" } },
              },
            ],
          },
        ],
      });

我的问题当使用硬编码数据进行测试时,这很好用,但是我应该如何处理动态数据呢?正如我所说的,动态数据将从客户端发送。

假设我从客户端到服务器端得到两个offeringseeking数组,并且其中任何一个数组都可以包含x个电影对象,我应该如何将这些对象插入到上面的查询格式中?
我唯一能想到的是,当我得到类似offering数组的东西时,我循环offering数组,并像上面那样格式化内容,将其传递给一个变量,然后像下面这样将该变量包含在mongo查询中:

// This will return an array filled with the movie objects, but in the format matching the above $or with the $elemMatch variables embedded
      const offeringFormated = offering.map((movieObject) => {
        return { offering: {$elemMatch: movieObject }}
      })

      const movieTrsades = await MovieTrade.find({
        $and: [
          {
            $or: offeringFormated,
          }....
        ],
      });`

我担心这要么是极其不正确的,要么是打破了某种编码惯例,无论是mongoosejs,我不知道。
或者如果有人理解我的目的,我将非常感谢指导或帮助如何以其他方式更有效地或遵守编程规则/标准来做这件事。谢谢!

qpgpyjmq

qpgpyjmq1#

可以使用$in运算符简化查询:

const movieTrades = await Trade.find({
    offering: { $in: offering },
    seeking: { $in: seeking }
});

相关问题