mongodb数组查询 - mongodb 内嵌数组查询问题: 如何限定返回与条件匹配的数组
伊谢尔伦
伊谢尔伦 2017-04-27 09:02:20
0
6
708

原数据为:

{
    "_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
        }
    ]
}
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全員に返信(6)
迷茫

これは簡単で、現在一致する配列のみを返すには次のステートメントを使用します。 リーリー

いいねを押す +0
洪涛

リーリー

favorite_shards 配列が返される場合、2 番目の配列要素のみが返されます。
ただし、これには、sid:577 がどの要素であるかを事前に知っておく必要があります。
mongodb 配列クエリのマニュアルには、カスタム条件を満たす配列ユニットを返すメソッドはありません。プログラムを使用して、返された結果セットの favourites_shards データをフィルタリングしてみることができます。

いいねを押す +0
淡淡烟草味

リーリー

質問の意味は分かりました、修正コードはこちらです

リーリー

結果:
{ "_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" : true } ] }

いいねを押す +0
阿神

射影演算子 $elemMatch を使用できます:

リーリー

$elemMatch の制限は、配列内で最初に一致したレコードのみを返すことができることです。

いいねを押す +0
Ty80

これは何のソフトウェアですか?

いいねを押す +0
習慣沉默

$unwind を使用してクエリを実行すると、クエリ条件を満たす複数のサブドキュメントが返されます。

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート