cari

Rumah  >  Soal Jawab  >  teks badan

mongodb数组查询 - mongodb 内嵌数组查询问题: 如何限定返回与条件匹配的数组

原数据为:

{
    "_id" : NumberLong(1181675746),
    "shard_qty" : 4,
    "goods_qty" : 0,
    "shop_qty" : 0,
    "favorite_qty" : 4,
    "favorite_shards" : [ 
      {
            "sid" : NumberLong(580),
            "favorite_dt" : ISODate("2015-06-26T12:13:06.405+08:00"),
            "is_attention" : true
        }, 
      {
            "sid" : NumberLong(579),
            "favorite_dt" : ISODate("2015-06-26T12:13:06.405+08:00"),
            "is_attention" : true
        }, 
        {
            "sid" : NumberLong(578),
            "favorite_dt" : ISODate("2015-06-26T12:13:06.405+08:00"),
            "is_attention" : true
        }, 
        {
            "sid" : NumberLong(577),
            "favorite_dt" : ISODate("2015-06-26T13:20:48.449+08:00"),
            "is_attention" : true
        }
    ]
}

查询条件为

db.getCollection('web_mem_favorites').findOne(
    {
    '_id':NumberLong(1181675746),
    'favorite_shards.sid': {
        '$in':[NumberLong(577),NumberLong(578)]
        }
    }
    ,{"favorite_shards":1}
)

想返回的数据:

{
    "_id" : NumberLong(1181675746),
    "favorite_shards" : [ 
      {
            "sid" : NumberLong(578),
            "favorite_dt" : ISODate("2015-06-26T12:13:06.405+08:00"),
            "is_attention" : true
        }, 
        {
            "sid" : NumberLong(577),
            "favorite_dt" : ISODate("2015-06-26T13:20:48.449+08:00"),
            "is_attention" : true
        }
    ]
}
伊谢尔伦伊谢尔伦2762 hari yang lalu714

membalas semua(6)saya akan balas

  • 迷茫

    迷茫2017-04-27 09:04:20

    Ini adalah mudah. ​​Gunakan pernyataan berikut untuk mengembalikan tatasusunan padanan semasa sahaja:

    db.getCollection('web_mem_favorites').find({"_id":NumberLong(1181675746),"favorite_shards.sid":NumberLong(577)},{"favorite_shards.$":1}).pretty()

    balas
    0
  • PHP中文网

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

    javascriptdb.getCollection('web_mem_favorites').find(
        {'_id':NumberLong(1181675746)},favorite_shards.sid': {'$in':[NumberLong(577)]}}
        {"_id" : 1, "favorite_shards": "$slice[2,1]" }
    )
    

    Apabila mengembalikan tatasusunan favorite_shards, hanya elemen tatasusunan kedua dikembalikan.
    Tetapi ini memerlukan mengetahui terlebih dahulu unsur sid:577 yang manakah.
    Dalam manual pertanyaan tatasusunan mongodb, tiada kaedah yang boleh mengembalikan unit tatasusunan yang memenuhi syarat tersuai Anda boleh cuba menggunakan atur cara untuk menapis data favorites_shards pada set hasil yang dikembalikan.

    balas
    0
  • 淡淡烟草味

    淡淡烟草味2017-04-27 09:04:20

    findOne( {'_id':NumberLong(1181675746),'favorite_shards.sid': {'$in':[NumberLong(577)]}} ,{"favorite_shards.$":1, "_id": 0} )
    

    Saya faham maksud soalan, berikut ialah kod yang diubah suai

    db.test.aggregate({"$unwind":"$favorite_shards"}, {"$match":{"favorite_shards.sid": {"$in": [NumberLong(578), NumberLong(577)]}}},  {"$group": {"_id": "$_id", "favorite_shards":{'$push': "$favorite_shards"}}})
    

    Keputusan:
    { "_id" : NumberLong(1181675746), "favorite_shards" : [ { "sid" : NumberLong(578), "favorite_dt" : ISODate("2015-06-26T0406.405Z"), "is_attention" : true }, { "sid" : NumberLong(577), "favorite_dt" : ISODate("2015-06-26T0548.449Z" ), "is_attention" : benar } ] }

    balas
    0
  • 阿神

    阿神2017-04-27 09:04:20

    Anda boleh menggunakan operator unjuran $elemMatch:

    javascriptdb.test.find({'favorite_shards.sid': 577}, {favorite_shards:{$elemMatch:{sid:577 }  } }).pretty()
    
    {
        "_id" : NumberLong(1181675746),
        "favorite_shards" : [
            {
                "sid" : NumberLong(577),
                "favorite_dt" : ISODate("2015-06-26T05:20:48.449Z"),
                "is_attention" : true
            }
        ]
    }
    

    Penghadan $elemMatch ialah ia hanya boleh mengembalikan rekod padanan pertama dalam tatasusunan.

    balas
    0
  • PHP中文网

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

    Saya ingin bertanya apakah perisian ini?

    balas
    0
  • 習慣沉默

    習慣沉默2017-04-27 09:04:20

    Anda boleh menggunakan $unwind untuk membuat pertanyaan dan berbilang subdokumen yang memenuhi syarat pertanyaan akan dikembalikan.

    db.web_mem_favorites.aggregate(
        {"$project":{"favorite_shards":"$favorite_shards"}},
        {"$unwind":"$favorite_shards"},
        {"$match":{"favorite_shards.sid": NumberLong(577)}}
    )
    

    balas
    0
  • Batalbalas