原数据为:
{
"_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
}
]
}
これは簡単で、現在一致する配列のみを返すには次のステートメントを使用します。 リーリー
リーリー
favorite_shards 配列が返される場合、2 番目の配列要素のみが返されます。
ただし、これには、sid:577 がどの要素であるかを事前に知っておく必要があります。
mongodb 配列クエリのマニュアルには、カスタム条件を満たす配列ユニットを返すメソッドはありません。プログラムを使用して、返された結果セットの favourites_shards データをフィルタリングしてみることができます。
リーリー
質問の意味は分かりました、修正コードはこちらです
リーリー結果:
{ "_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 } ] }
射影演算子 $elemMatch を使用できます:
リーリー$elemMatch の制限は、配列内で最初に一致したレコードのみを返すことができることです。
これは何のソフトウェアですか?
$unwind を使用してクエリを実行すると、クエリ条件を満たす複数のサブドキュメントが返されます。
リーリー