【问题标题】:MongoDB: How to find documents by value?MongoDB:如何按值查找文档?
【发布时间】:2021-11-20 03:04:54
【问题描述】:

两个包含ObjectId("6148a371c13a6a0be492ebf4")的文档

文档 1

  {
           "_id" : ObjectId("6144f66fb9543917f96fc"),
           "refId" : "ford",
            "template" : "6144f61cb96d772317f96f9",
            "fieldValues" : {
                "PDV" : [ 
                    "6126938cd24a8aa3d37b4992", 
                    ObjectId("6148a371c13a6a0be492ebf4")
                ]
            },
            "group" : ObjectId("6144f66fb96d7731917f96fd"),
            "createdAt" : ISODate("2021-09-17T20:11:27.440Z"),
            "updatedAt" : ISODate("2021-09-20T15:06:26.146Z"),
            "__v" : 0
  }

文档 2

 {
            "_id" : ObjectId("6144f66fb96d77rr3217f96fc"),
            "refId" : "CCM",
            "template" : "6144f613296d7731917f96f9",
            "fieldValues" : {
                "DDB" : [ 
                    "6126938cd2448aa3d37b4992", 
                    "5443938cd2448aa3d37b4992", 
                    ObjectId("6148a371c13a6a0be492ebf4"),
                ]
            },
            "group" : ObjectId("6144f66fb96de431917f96fd"),
            "createdAt" : ISODate("2021-09-17T20:11:27.440Z"),
            "updatedAt" : ISODate("2021-09-20T15:06:26.146Z"),
            "__v" : 0
 }

我们寻找的ObjectId 总是在fieldValues 内部,但我们总是有不同的命名而不是PDVDDB

所以我们不能使用这种类型的查询: db.getCollection('products').find({"fieldValues.PDV":ObjectId('6148a371c13a6a0be492ebf4')})


附言。这个查询应该只在数据库上工作,我们不能查询所有产品并在后端进行计算,可能会有数百万个产品。

【问题讨论】:

  • 具体条件是什么? ObjectId("6148a371c13a6a0be492ebf4") 可能出现在文档中任何地方?拥有一个包含不同数据类型元素的数组(PDV 或 DDB)会变得相当复杂。
  • 谢谢 Wernfried Domscheit,很好,我刚刚更新了我的问题。
  • “我们无法查询所有产品并进行计算” - 这正是您对查询所做的。
  • Wernfried Domscheit 是的,我删除了这个查询示例,因为它是错误的,只会让人们感到困惑。

标签: node.js arrays mongodb


【解决方案1】:

你可以用这个:

db.collection.aggregate([
  {
    $set: {
      kv: { $first: { $objectToArray: "$fieldValues" } }
    }
  },
  { $match: { "kv.v": ObjectId("6148a371c13a6a0be492ebf3") } },
  { $unset: "kv" }
])

Mongo Playground

【讨论】:

  • Wernfried Domscheit 谢谢!这是一个很好的解决方案!
【解决方案2】:

您可能会认为这样的解决方案会奏效,但这可能不起作用的一个原因是您试图在对象上使用===。如果您参考此thread,则使用.equals() 而不是=== 可能会有所帮助。

【讨论】:

    【解决方案3】:

    db.products.find({'_id': ObjectId("6148a371c13a6a0be492ebf4")})

    您的代码中的错误是您使用了 key 而不是 _id

    不过,这种书写方式对手指来说要容易得多。

    【讨论】:

    • 在你的情况下 _id 是关键,但我在这个数组中没有关键。在这种情况下,您的解决方案将不起作用。
    猜你喜欢
    • 2021-07-01
    • 2017-04-15
    • 2015-05-03
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多