【问题标题】:Querying an Array of docs (tricky)查询文档数组(棘手)
【发布时间】:2022-01-16 22:48:26
【问题描述】:

这里是初学者。给我一个find() 查询,它将给出“Sam”的年龄

需要查询承包商的文档数组。 “name”字段是具有 fname:“Sam”的文档。但是“年龄”字段不在这个“姓名”文档中,它在上一级文档中。

需要一个广泛的查询,即使“Sam”的位置是大型数据库中的任何随机位置,它也可以工作

预期输出:

{age : 22}
{
    "name" : "Apples",
    "qty" : 120,
    "from" : [
        "USA",
        "Brazil",
        "Russia"
    ],
    "contractors" : [
        {
            "name" : {
                "fname" : "Sam",
                "lname" : "McGregor"
            },
            "age" : 22
        },
        {
            "name" : {
                "fname" : "zxc",
                "lname" : "asd"
            },
            "age" : 32
        }
    ]
}

【问题讨论】:

  • yourInput.contractors.find(c => c.name.fname === 'Sam').age ?

标签: mongodb nosql


【解决方案1】:

查询1

  • 使用fname=samlname= McGregor 查找承包商成员(如果您只想要名称,请删除名称过滤器)
  • 并计划保持此匹配成员的年龄
  • 使用驱动程序的findOne 方法,因为无论如何年龄都会相同

Test code here

find({
  "contractors": {
    $elemMatch: {
      "name.fname": "Sam",
      "name.lname": "McGregor"
    }
  }
},
{
  "contractors.age.$": 1,
  "_id": 0
})

查询2

  • 聚合解决方案
  • 匹配 fname,lfname(需要多键索引才能快)
  • 限制为 1,因为无论如何年龄都是一样的
  • 过滤从数组中找到Sam
  • 项目只保留他的年龄

*与上面不同的是元素匹配,将匹配到的成员保存在$中,所以我们不用重新搜索。 但是如果你有多键索引,这个解决方案会很快。

Test code here

aggregate(
[{"$match":  
    {"$and": 
      [{"contractors.name.fname": {"$eq": "Sam"}},
        {"contractors.name.lname": {"$eq": "McGregor"}}]}},
  {"$limit": 1},
  {"$project": 
    {"_id": 0,
      "age": 
      {"$getField": 
        {"field": "age",
          "input": 
          {"$first": 
            {"$filter": 
              {"input": "$contractors",
                "cond": 
                {"$and": 
                  [{"$eq": ["$$this.name.fname", "Sam"]},
                    {"$eq": ["$$this.name.lname", "McGregor"]}]}}}}}}}}])

【讨论】:

  • find() 给出 [ { _id: ObjectId("61b7697adc481344f34babf0"), 承包商: [ { age: 22 } ] } ] 聚合更好: [ { _id: ObjectId("61b7697adc481344f34babf0") , age: 22 } ] 只需要弄清楚如何得到:{age: 22} only
  • mongodb 总是返回一个文档数组,你总是会得到[{...} {...} ...] 我更新了两个答案以删除_id 也,要从两者中获取年龄,你会用你的编程语言来做.它很容易做到。聚合现在返回 [{"age" : 22}] 你不能再使用 MongoDB,你应该使用你的编程语言获取第一个成员和字段年龄的值
  • 你这个男人^_^
猜你喜欢
  • 2016-01-12
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多