【问题标题】:How to return the key which value matches of an array in MongoDB?如何返回与MongoDB中数组的值匹配的键?
【发布时间】:2023-03-06 19:42:02
【问题描述】:

我们如何查询匹配的值,并返回它的键。在这种情况下,数据库中只有 1 个文档。

const mongoose = require("mongoose");

const listSchema = new mongoose.Schema({
yuck: [String],
yumm: [String]
});

const List = mongoose.model("List", listSchema);

List.create({
yuck: [ "orange", "banana"],
yumm: ["broccoli", "chocolate"]
});

List.find({ $query: "chocolate" }, (err,result)=>{
console.log("Key is>>>", result);
});

//How do we query such that it will return the key whose value matches?
// Key is>>> yumm

【问题讨论】:

  • 我更新我的答案

标签: node.js mongodb mongoose


【解决方案1】:

查询

  • 如果您的密钥不是动态的并且它们只是那 2 个,您也可以使用这种简化的方式
  • 匹配以查找哪些文档具有"chocolate"
    (您可以在 yumm/yuck 上创建 2 个索引以加快速度)
  • 检查 2 个 "chocolate" 中的哪一个存在的条件

Test code here

aggregate(
[{"$match":
  {"$or":
   [{"yuck":{"$eq":"chocolate"}}, {"yumm":{"$eq":"chocolate"}}]}},
 {"$project":
  {"_id":0,
   "key":{"$cond":[{"$in":["chocolate", "$yuck"]}, "yuck", "yumm"]}}}])

【讨论】:

    【解决方案2】:
    db.collection.aggregate([
      {
        "$match": {}
      },
      {
        "$set": {
          "arr": { "$objectToArray": "$$ROOT" }
        }
      },
      {
        "$match": {
          "arr.v": "chocolate"
        }
      },
      {
        "$set": {
          "arr": {
            "$filter": {
              "input": { $slice: [ "$arr", 1, { "$size": "$arr" }] },
              "as": "item",
              "cond": {
                "$in": [ "chocolate", "$$item.v" ]
              }
            }
          }
        }
      },
      {
        "$project": { key: { "$first": "$arr.k"} }
      }
    ])
    

    mongoplayground


    db.collection.aggregate([
      {
        "$match": {}
      },
      {
        "$project": {
          "arr": { "$objectToArray": "$$ROOT" }
        }
      },
      {
        "$match": { "arr.v": "chocolate" }
      },
      {
        "$unwind": "$arr"
      },
      {
        "$match": { "arr.v": "chocolate" }
      },
      {
        "$project": { "key": "$arr.k" }
      }
    ])
    

    mongoplayground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 2020-07-15
      • 1970-01-01
      • 2015-05-27
      • 2019-12-21
      • 2014-10-14
      • 1970-01-01
      相关资源
      最近更新 更多