【问题标题】:How can i do elemMatch inside array using mongodb?如何使用 mongodb 在数组内部进行 elemMatch?
【发布时间】:2021-08-08 15:33:00
【问题描述】:

我的bookings集合中有以下用户详细信息

{
    "_id" : ObjectId("609a382b589346973c84c6fe"),
    "Name" : "abc",
    "UserId":1
    "Status" : "Pending",    
    "BookingData" : {
        "Date" : ISODate("2021-04-30T04:00:00.000Z"),
        "info" : [],
        "BookingDataMethod" : "avf",
        "Message" : null,
        "products" : [ 
            {
                "_id" : ObjectId("60a4e92775e5de3570578820"),
                "ProductName" : "Test1",
                "ProductID" : ObjectId("60a4e92475e5de357057880a"),
                "IsDeliveryFailed" : "Yes"
            }, 
            {
                "_id" : ObjectId("60a4e92775e5de357057881f"),
                "ProductName" : "Test2",
                "ProductID" : ObjectId("60a4e92475e5de357057880d")
            }
        ],
        
    }
    
}

我已经为以下条件准备了一个查询,当我运行以下查询时,我应该得到 "UserId":1 文档,但我得到了 0 记录

条件 1:产品不应为空

条件 2:ProductID 应存在于 products 数组中且不应为空
条件 3:IsDeliveryFailed 不应为“是”

基于上述用户,只有一个产品交付失败(IsDeliveryFailed": "Yes"),所以当我运行此查询时,它应该返回 "UserId":1 文档。如果两个产品 "IsDeliveryFailed": "Yes" " 然后 我们不应该得到这个用户

查询

db.getCollection('bookings').find({
    "$and": [
              { "BookingData.products": { $ne: [] } },
              { "BookingData.products": {"$elemMatch":{ "ProductID": { "$exists": true ,$ne: null } }} },
              { "BookingData.products": {"$elemMatch":{ "IsDeliveryFailed": { $ne: 'Yes' } }} }
            ]
})

有人可以告诉我上述查询的问题吗,或者请帮我准备针对上述情况的查询?

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    我认为你可以通过聚合来做到这一点

    db.collection.aggregate([
      {
        $match: {
          "BookingData.products": { "$exists": true }
        }
      },
      {
        $set: {
          "BookingData.products": {
            "$filter": {
              "input": "$BookingData.products",
              "cond": {
                $and: [
                  { $ne: [ "$$this.ProductID", undefined ] },
                  { $ne: [ "$$this._id", null ] },
                  { $ne: [ "$$this.IsDeliveryFailed", "Yes" ] }
                ]
              }
            }
          }
        }
      },
      {
        $match: {
          $expr: {
            $ne: [ "$BookingData.products", [] ]
          }
        }
      }
    ])
    

    工作Mongo playground

    【讨论】:

    • 如果两个产品 "IsDeliveryFailed": "Yes" 那么我们不应该显示这个用户请检查mongoplayground.net/p/bPhSY1cHvmi 。现在它显示用户的产品是空的,但我希望它不应该返回这个用户。跨度>
    • 那么如果products是一个空数组,我们就不会显示了吧?这是从这些条件得出的最终结论吗?
    • 更新了答案。请看一下
    • { $ne: [ "$$this._id", null ] } 是什么意思?你能帮我理解吗
    • 当然。我们可以使用$filter 过滤数组。 $ne 表示 not equal to 验证您的第二个条件,productId 应该在那里,不能为空
    猜你喜欢
    • 1970-01-01
    • 2017-05-28
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多