Maison > Questions et réponses > le corps du texte
原数据为:
{
"_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
}
]
}
迷茫2017-04-27 09:04:20
C'est simple. Utilisez l'instruction suivante pour renvoyer uniquement le tableau correspondant actuel :
db.getCollection('web_mem_favorites').find({"_id":NumberLong(1181675746),"favorite_shards.sid":NumberLong(577)},{"favorite_shards.$":1}).pretty()
PHP中文网2017-04-27 09:04:20
javascript
db.getCollection('web_mem_favorites').find( {'_id':NumberLong(1181675746)},favorite_shards.sid': {'$in':[NumberLong(577)]}} {"_id" : 1, "favorite_shards": "$slice[2,1]" } )
Lors du renvoi du tableau favorite_shards, seul le deuxième élément du tableau est renvoyé.
Mais cela nécessite de savoir à l’avance de quel élément il s’agit sid:577.
Dans le manuel de requête de tableau mongodb, aucune méthode ne peut renvoyer des unités de tableau répondant à des conditions personnalisées. Vous pouvez essayer d'utiliser un programme pour filtrer les données favorites_shards sur l'ensemble de résultats renvoyé.
淡淡烟草味2017-04-27 09:04:20
findOne( {'_id':NumberLong(1181675746),'favorite_shards.sid': {'$in':[NumberLong(577)]}} ,{"favorite_shards.$":1, "_id": 0} )
Je comprends le sens de la question, voici le code modifié
db.test.aggregate({"$unwind":"$favorite_shards"}, {"$match":{"favorite_shards.sid": {"$in": [NumberLong(578), NumberLong(577)]}}}, {"$group": {"_id": "$_id", "favorite_shards":{'$push': "$favorite_shards"}}})
Résultat :
{ "_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" : vrai } ] }
阿神2017-04-27 09:04:20
Vous pouvez utiliser l'opérateur de projection $elemMatch :
javascript
db.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 } ] }
La limitation de $elemMatch est qu'il ne peut renvoyer que le premier enregistrement correspondant dans le tableau.
習慣沉默2017-04-27 09:04:20
Vous pouvez utiliser $unwind pour interroger, et plusieurs sous-documents qui répondent aux conditions de requête seront renvoyés.
db.web_mem_favorites.aggregate(
{"$project":{"favorite_shards":"$favorite_shards"}},
{"$unwind":"$favorite_shards"},
{"$match":{"favorite_shards.sid": NumberLong(577)}}
)