搜索

首页  >  问答  >  正文

mongodb - mongo数组查询,如何仅返回当前匹配数组?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<code>db.test.find();

{

    _id: ObjectId('55e99a2190df7a911d6ed1f1'),

    list: [

        {

            "aa": 10,

            "data": "test"

        },

        {

            "aa": 1,

            "data": "test"

        }

    ]

}

 

db.test.find({_id: ObjectId('55e99a2190df7a911d6ed1f1'), list: {'$elemMatch': {'aa': 1}}})

预期结果:

{_id: ObjectId('55e99a2190df7a911d6ed1f1'),

list: {

        "aa": 1,

        "data": "test"

}</code>

PHP中文网PHP中文网2879 天前649

全部回复(4)我来回复

  • PHPz

    PHPz2017-04-27 09:04:24

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    <code>> db.customer.find().pretty()

    {

        "_id" : ObjectId("559bb1d1d39f0dcac2658f8e"),

        "cust_id" : "abc123",

        "ord_date" : ISODate("2012-10-03T16:00:00Z"),

        "status" : "A",

        "price" : 25,

        "items" : [

            {

                "sku" : "mmm",

                "qty" : 5,

                "price" : 2.5

            },

            {

                "sku" : "nnn",

                "qty" : 5,

                "price" : 2.5

            }

        ]

    }

    {

        "_id" : ObjectId("559bb1ead39f0dcac2658f8f"),

        "cust_id" : "abc123",

        "ord_date" : ISODate("2012-10-03T16:00:00Z"),

        "status" : "B",

        "price" : 30,

        "items" : [

            {

                "sku" : "mmm",

                "qty" : 6,

                "price" : 3.5

            },

            {

                "sku" : "nnn",

                "qty" : 6,

                "price" : 3.5

            }

        ]

    }

    {

        "_id" : ObjectId("559bb200d39f0dcac2658f90"),

        "cust_id" : "abc123",

        "ord_date" : ISODate("2012-10-03T16:00:00Z"),

        "status" : "C",

        "price" : 35,

        "items" : [

            {

                "sku" : "mmm",

                "qty" : 7,

                "price" : 4.5

            },

            {

                "sku" : "nnn",

                "qty" : 7,

                "price" : 4.5

            }

        ]

    }

    > db.customer.find({"items.qty":6},{"items.$":1}).pretty()  //只返回和查询条件匹配的那一个元素 

    {

        "_id" : ObjectId("559bb1ead39f0dcac2658f8f"),

        "items" : [

            {

                "sku" : "mmm",

                "qty" : 6,

                "price" : 3.5

            }

        ]

    }</code>

    查询匹配的内嵌文档,你也可以直接查询,如:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    <code>> db.customer.find({"items.qty":6}).pretty()

    {

        "_id" : ObjectId("559bb1ead39f0dcac2658f8f"),

        "cust_id" : "abc123",

        "ord_date" : ISODate("2012-10-03T16:00:00Z"),

        "status" : "B",

        "price" : 30,

        "items" : [

            {

                "sku" : "mmm",

                "qty" : 6,

                "price" : 3.5

            },

            {

                "sku" : "nnn",

                "qty" : 6,

                "price" : 3.5

            }

        ]

    }</code>

    对应你上面的查询实现:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    <code>> db.customer.find({"_id":ObjectId("559bb1ead39f0dcac2658f8f"),items: {'$elemMatch': {'sku': "mmm"}}},{"items.$":1}).pretty()

    {

        "_id" : ObjectId("559bb1ead39f0dcac2658f8f"),

        "items" : [

            {

                "sku" : "mmm",

                "qty" : 6,

                "price" : 3.5

            }

        ]

    }</code>

    db.test.find({_id: ObjectId('55e99a2190df7a911d6ed1f1'), list: {'$elemMatch': {'aa': 1}}},{"list.$":1}).pretty()

    回复
    0
  • PHPz

    PHPz2017-04-27 09:04:24

    首先 你用mongodb 你得明白 monggodb是nosql
    然后 mongo的collection中存储的是document
    最后 你要知道 find 返回的值一定是一个document的集合 也就是个array

    所以你说的 基本上无法实现

    回复
    0
  • PHP中文网

    PHP中文网2017-04-27 09:04:24

    只需要在find中填写你需要的查询的条件即可。更多详情,请查阅mongodb官网

    回复
    0
  • 为情所困

    为情所困2017-04-27 09:04:24

    使用 $ 操作符能返回一个 多个的话 没门

    回复
    0
  • 取消回复