第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何用MongoDB過濾子文檔中的數(shù)組

如何用MongoDB過濾子文檔中的數(shù)組

慕勒3428872 2019-06-21 15:40:58
如何用MongoDB過濾子文檔中的數(shù)組我在子文檔中有這樣的數(shù)組{     "_id" : ObjectId("512e28984815cbfcb21646a7"),     "list" : [         {             "a" : 1         },         {             "a" : 2         },         {             "a" : 3         },         {             "a" : 4         },         {             "a" : 5         }     ]}我能過濾一個>3的子文檔嗎?我的預期結果如下{     "_id" : ObjectId("512e28984815cbfcb21646a7"),     "list" : [         {             "a" : 4         },         {             "a" : 5         }     ]}我試著用$elemMatch但是返回數(shù)組中的第一個匹配元素。我的問題是:db.test.find( { _id" : ObjectId("512e28984815cbfcb21646a7") }, {      list: {          $elemMatch:              { a: { $gt:3 }              }      } } )結果返回數(shù)組中的一個元素。{ "_id" : ObjectId("512e28984815cbfcb21646a7"), "list" : [ { "a" : 4 } ] }我試著用聚合$match但不工作db.test.aggregate({$match:{_id:ObjectId("512e28984815cbfcb21646a7"), 'list.a':{$gte:5}  }})它返回數(shù)組中的所有元素{     "_id" : ObjectId("512e28984815cbfcb21646a7"),     "list" : [         {             "a" : 1         },         {             "a" : 2         },         {             "a" : 3         },         {             "a" : 4         },         {             "a" : 5         }     ]}我能過濾數(shù)組中的元素以得到預期的結果嗎?
查看完整描述

3 回答

?
哆啦的時光機

TA貢獻1779條經(jīng)驗 獲得超6個贊

使用aggregate是正確的方法,但你需要$unwind這個list數(shù)組之前,在應用$match以便篩選單個元素,然后使用$group把它重新組合起來:

db.test.aggregate(
    { $match: {_id: ObjectId("512e28984815cbfcb21646a7")}},
    { $unwind: '$list'},
    { $match: {'list.a': {$gt: 3}}},
    { $group: {_id: '$_id', list: {$push: '$list.a'}}})

產(chǎn)出:

{
  "result": [
    {
      "_id": ObjectId("512e28984815cbfcb21646a7"),
      "list": [
        4,
        5
      ]
    }
  ],
  "ok": 1}

MongoDB 3.2更新

從3.2版開始,您可以使用新的$filter聚合運算符以更有效地完成此操作,只需包括list控件期間所需的元素。$project:

db.test.aggregate([
    { $match: {_id: ObjectId("512e28984815cbfcb21646a7")}},
    { $project: {
        list: {$filter: {
            input: '$list',
            as: 'item',
            cond: {$gt: ['$$item.a', 3]}
        }}
    }}])


查看完整回答
反對 回復 2019-06-21
?
拉丁的傳說

TA貢獻1789條經(jīng)驗 獲得超8個贊

如果需要多個匹配的子文檔,上述解決方案最好。$elemMatch如果需要單個匹配的子文檔作為輸出,也非常有用。

db.test.find({list: {$elemMatch: {a: 1}}}, {'list.$': 1})

結果:

{
  "_id": ObjectId("..."),
  "list": [{a: 1}]}


查看完整回答
反對 回復 2019-06-21
?
守候你守候我

TA貢獻1802條經(jīng)驗 獲得超10個贊

使用$Filter聚合

根據(jù)指定的條件選擇要返回的數(shù)組的子集。返回只包含與條件匹配的元素的數(shù)組。返回的元素按原來的順序排列。

db.test.aggregate([
    {$match: {"list.a": {$gt:3}}}, // <-- match only the document which have a matching element
    {$project: {
        list: {$filter: {
            input: "$list",
            as: "list",
            cond: {$gt: ["$$list.a", 3]} //<-- filter sub-array based on condition
        }}
    }}]);


查看完整回答
反對 回復 2019-06-21
  • 3 回答
  • 0 關注
  • 2039 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號