簡體   English   中英

從不同文檔的數組中獲取多個對象MongoDb

[英]Get Multiple Objects From Array in different Documents MongoDb

我的收藏館是

/* 1 */
{
    "_id" : ObjectId("566121aa4b88d840eb7d1c50"),
    "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"),
    "array" : [ 
        {
            "id" : 1
        }, 
        {
            "id" : 2
        }, 
        {
            "id" : 3
        }, 
        {
            "id" : 4
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5661224a4b88d840eb7d1c51"),
    "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"),
    "array" : [ 
        {
            "id" : 1
        }, 
        {
            "id" : 7
        }, 
        {
            "id" : 3
        }, 
        {
            "id" : 5
        }
    ]
}

我需要的是在array'array'中提取對象,其中batchCourseId = ObjectId(“ 566122ab94b792fbdf81bcf3”)

2<array.id<=5

預期輸出為

/* 1 */
    {
        "_id" : ObjectId("566121aa4b88d840eb7d1c50"),
        "array" : [             
            {
                "id" : 3
            }, 
            {
                "id" : 4
            }
        ]
    }

/* 2 */
{
    "_id" : ObjectId("5661224a4b88d840eb7d1c51"),
    "array" : [            
        {
            "id" : 3
        }, 
        {
            "id" : 5
        }
    ]
}

已經嘗試過

db.coll.find({"batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3")},
    { array: { $elemMatch: { id: { $gt: 2,$lte: 5} } } })

輸出就像

/* 1 */
{
    "_id" : ObjectId("566121aa4b88d840eb7d1c50"),
    "array" : [ 
        {
            "id" : 3
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5661224a4b88d840eb7d1c51"),
    "array" : [ 
        {
            "id" : 3
        }
    ]
}

關閉,但僅結果數組中的第一個匹配對象

僅供參考,這只是樣本數據集,原始數據更復雜且數量更多

因此,請讓我知道執行此操作的最佳做​​法,性能也很重要

提前致謝

您可以使用聚合來實現相同目的。 示例如下所示:

db.coll.aggregate(
  {$match: {"batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3")}},
  {$unwind: '$array'},
  {$match: {'array.id': { $gt: 2,$lte: 5}}},
  {$group: {_id: '$_id', array: {$push : '$array'}}}
)

結果:

{ "_id" : ObjectId("5661224a4b88d840eb7d1c51"), "array" : [ { "id" : 3 }, { "id" : 5 } ] }
{ "_id" : ObjectId("566121aa4b88d840eb7d1c50"), "array" : [ { "id" : 3 }, { "id" : 4 } ] }

在MongoDB中,聚合$unwind會產生Cartesian_product問題,因此在大數據集中避免$unwind是一個好方法。

讓我們檢查您的示例,如果您在aggregation使用$unwind ,則結果如下所示

db.collectionName.aggregate([
    { "$match": { "batchCourseId": ObjectId("566122ab94b792fbdf81bcf3") }}, 
    { "$unwind": "$array" }
])

所以上述查詢的結果是:

{ "_id" : ObjectId("566121aa4b88d840eb7d1c50"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 1 } }
{ "_id" : ObjectId("566121aa4b88d840eb7d1c50"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 2 } }
{ "_id" : ObjectId("566121aa4b88d840eb7d1c50"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 3 } }
{ "_id" : ObjectId("566121aa4b88d840eb7d1c50"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 4 } }
{ "_id" : ObjectId("5661224a4b88d840eb7d1c51"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 1 } }
{ "_id" : ObjectId("5661224a4b88d840eb7d1c51"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 7 } }
{ "_id" : ObjectId("5661224a4b88d840eb7d1c51"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 3 } }
{ "_id" : ObjectId("5661224a4b88d840eb7d1c51"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 5 } }

這會創建多個文檔,而在集合中的大文檔中會降低性能並增加處理時間。

代替$ unwind使用$ map聚合集運算符聚合 ,查詢如下:

db.collection.aggregate([{
  "$match": {
    "batchCourseId": ObjectId("566122ab94b792fbdf81bcf3")
  }
}, {
  "$project": {
    "array": {
      "$setDifference": [{
          "$map": {
            "input": "$array",
            "as": "el",
            "in": {
              "$cond": {
                "if": {
                  "$and": [{
                    "$gt": ["$$el.id", 2]
                  }, {
                    "$lte": ["$$el.id", 5]
                  }]
                },
                "then": "$$el",
                "else": false
              }
            }
          }
        },
        [false]
      ]
    }
  }
}])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM