【问题标题】:MongoDB Custom sorting on two fieldsMongoDB对两个字段的自定义排序
【发布时间】:2020-03-04 17:47:50
【问题描述】:

在我们的 MongoDB 文档中,我们有两个字段,organisationIdemployeeId

我想显示集合中的所有元素,它们中的任何一个都与查询参数匹配,因此是基本的 OR。

排序的一个条件是我要求首先出现两个字段都匹配查询参数的文档,然后是匹配organisationName参数的文档,下一个。

我们的想法是先显示员工(即您)的数据,然后再显示您组织的数据。 (在我们的案例中,您首先建议的主题,然后是您组织中的其他员工建议的主题。 截至目前,我正在使用以下查询来实现这一点 -

Campaigns.find({$and : [{'organisationName' : organisationName},{'employeeName' : userName}]},{}),
Campaigns.find({$and : [{'organisationName' : organisationName},{'employeeName' : {$ne : userName}}]},{}) 

但这对我来说似乎不是最有效的方法。任何其他可以在一次调用中执行此操作的查询都会非常好,因为这也有助于分页。

提前致谢

【问题讨论】:

  • 解决方案是,为每个文档添加一个新字段,使用$addFields,比如说order,条件使用$cond and if 添加其他运算符,根据条件为其分配值 1,2,3,4....。然后使用$sort中的order进行排序。
  • 我不赞成更改数据。我可以设想的问题是,每个组织将有多个员工,每个人都会有一些主题的 ID。我们现在不会为每次搜索更改这些值。
  • 不,您不必更改数据,当您触发查询时,只需在查询中使用 $addFields 而不是在 DB 中添加一个新字段,然后使用它仅在查询中,不更改任何数据。而且这个文件不会被存储,所以它就在那里,直到你发回结果,当其他员工进行搜索时,将为他创建一个新的订单文件,它只是上下文和临时的,而不是永久的。在此处阅读有关 $addFields docs.mongodb.com/manual/reference/operator/aggregation/… 的信息。
  • 哦酷,我试试看,谢谢

标签: node.js mongodb sorting nosql mongodb-query


【解决方案1】:

这个聚合查询得到想要的结果:

输入文件:

{ "org" : "o1", "emp" : "e1", "data" : "1234" }
{ "org" : "o1", "emp" : "e2", "data" : "abcd" }
{ "org" : "o1", "emp" : "b3", "data" : "xyz" }
{ "org" : "o2", "emp" : "z3", "data" : "zzz" }

查询参数:

orgNameParam = "o1"
usrNameParam = "e2"

查询:

db.orgemp.aggregate([
  { $match: { org: orgNameParam} },
  { $facet: {
     firstQuery: [
          { $match: { emp: usrNameParam } }
     ],
     secondQuery: [
          { $addFields: { isNotEmp: { $ne: [ "$emp", usrNameParam ] } } },
          { $match: { isNotEmp: true } },
          { $project: { isNotEmp: 0 } },
          { $sort: { emp: 1 } },
     ],
  } },
  { $project: { result: { $concatArrays: [ "$firstQuery", "$secondQuery" ] } } },
])

结果:

{
        "result" : [
                {
                        "_id" : ObjectId("5dc51432c2ac920e04692778"),
                        "org" : "o1",
                        "emp" : "e2",
                        "data" : "abcd"
                },
                {
                        "_id" : ObjectId("5dc51432c2ac920e04692779"),
                        "org" : "o1",
                        "emp" : "b3",
                        "data" : "xyz"
                },
                {
                        "_id" : ObjectId("5dc51432c2ac920e04692777"),
                        "org" : "o1",
                        "emp" : "e1",
                        "data" : "1234"
                }
        ]
}

【讨论】:

  • 是的,输入文档只通过 facet 阶段一次(并且两个查询都使用相同的数据集执行)。
猜你喜欢
  • 2015-08-11
  • 2018-01-25
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 2012-12-20
  • 2015-01-20
  • 1970-01-01
  • 2017-07-30
相关资源
最近更新 更多