【问题标题】:How We combine two query in MongoDB $in and $nin with same condition?我们如何在 MongoDB $in 和 $nin 中以相同的条件组合两个查询?
【发布时间】:2021-01-07 20:08:25
【问题描述】:

我想将$in 查询的结果与$nin 查询结合起来,并想要最终结果。那么我们如何使用一个 mongo 查询来做到这一点呢?有什么办法吗? 例如,我在用户集合中有以下文档:

[{
    name:"test",
    "uid":123
},{
    name:"test1",
    "uid":124
},{
    name:"test2",
    "uid":125
},{
    name:"test3",
    "uid":126
},{
    name:"test3",
    "uid":127
}]

我想要以下结果:

[{
    name:"test2",
    "uid":125
},{
    name:"test3",
    "uid":126
},{
    name:"test",
    "uid":123
},{
    name:"test3",
    "uid":127
}]

基本上,我希望前两个位置的uid:125uid:126 忽略它们的顺序,然后第三和第四位置的uid:123uid: 127 忽略它们的顺序。所以我通过以下两个查询来做到这一点

  1. db.getCollection('user').find({uid:{$in:[125,126]}})

  2. db.getCollection('user').find({uid:{$nin:[125,126]}})

然后我将结果合并,但我如何在同一个查询中做到这一点?我有这么多文档,这只是一个例子,所以需要结合 $in 和 $nin 查询的结果

我该怎么做?

【问题讨论】:

  • 您能否提供更多详细信息、当前结果、预期结果以及您的查询实现和示例文档。
  • @turivishal 更新了问题,请您帮忙解决这个问题

标签: mongodb mongoose mongodb-query


【解决方案1】:

没有直接的方法可以做到这一点,我最近回答了here,几乎类似的问题,

  • 你需要使用聚合查询,尝试$cond将检查uid是否在数组[125, 126]中然后返回1,否则在matchResult中返回0,
  • $sort matchResult 按降序排列
db.getCollection('user').aggregate([
  {
    $addFields: {
      matchResult: {
        $cond: [{ $in: ["$uid", [125, 126]] }, 1, 0]
      }
    }
  },
  { $sort: { matchResult: -1 } }
])

Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2015-05-17
    • 1970-01-01
    • 2023-03-06
    • 2021-12-30
    • 1970-01-01
    • 2017-03-07
    相关资源
    最近更新 更多