javascript - _id - objectid mongodb to string
Comment convertir mongo ObjectId.toString sans inclure 'ObjectId()' wrapper-juste la valeur? (1)
Ce que j'essaie de résoudre est: en préservant l'ordre de mon tableau d'IDs avec $ en utilisant cette méthode suggérée (mapReduce): Est - ce que MongoDB $ in clause guarantee
J'ai fait mes devoirs, et j'ai vu que c'était idéal pour les convertir en cordes: en comparant les mano et les cordes .
Code:
var dataIds = [ '57a1152a4d124a4d1ad12d80',
'57a115304d124a4d1ad12d81',
'5795316dabfaa62383341a79',
'5795315aabfaa62383341a76',
'57a114d64d124a4d1ad12d7f',
'57953165abfaa62383341a78' ];
CollectionSchema.statics.all = function() {
var obj = {};
//adds dataIds to obj.scope as inputs , to be accessed in obj.map
obj.scope = {'inputs': dataIds};
obj.map = function() {
//used toString method as suggested in other SO answer, but still get -1 for Id.
var order = inputs.indexOf(this._id.toString());
emit(order, {
doc : this
});
};
obj.reduce = function() {};
obj.out = {inline: 1};
obj.query = {"_id": {"$in": dataIds } };
obj.finalize = function(key, value) {
return value;
};
return Product
.mapReduce(obj)
.then(function(products){
console.log('map products : ', products)
})
};
C'est ce que je continue à obtenir pour mon console.log dans la promesse de produits:
[{ _id: -1, value: null } ]
Ce qui m'amène à croire qu'il n'est pas capable de faire correspondre l'ObjectId avec un index de dataId. Cependant, si j'utilise simplement la clause $ in dans un .find (), les bons produits sont retournés - mais dans l'ordre incorrect.
Mettre à jour:
avoir un comportement inattendu avec ça.
obj.map = function() {
for(var i = 0; i < inputs.length; i++){
if(inputs[i] == this._id.toString()){
}
emit(inputs[i], this);
}
};
émet:
[ { _id: '5795315aabfaa62383341a76', value: null },
{ _id: '57953165abfaa62383341a78', value: null },
{ _id: '5795316dabfaa62383341a79', value: null },
{ _id: '57a114d64d124a4d1ad12d7f', value: null },
{ _id: '57a1152a4d124a4d1ad12d80', value: null },
{ _id: '57a115304d124a4d1ad12d81', value: null } ]
obj.map = function() {
for(var i = 0; i < inputs.length; i++){
if(inputs[i] == this._id.toString()){
var order = i;
}
emit(this._id.toString(), this);
}
};
émet:
[ { _id: 'ObjectId("5795315aabfaa62383341a76")', value: null },
{ _id: 'ObjectId("57953165abfaa62383341a78")', value: null },
{ _id: 'ObjectId("5795316dabfaa62383341a79")', value: null },
{ _id: 'ObjectId("57a114d64d124a4d1ad12d7f")', value: null },
{ _id: 'ObjectId("57a1152a4d124a4d1ad12d80")', value: null },
{ _id: 'ObjectId("57a115304d124a4d1ad12d81")', value: null } ]
Maintenant, comment puis-je me débarrasser du wrapper ObjectId ()? De préférence, quelque chose de plus propre que str.slice (), ce qui fonctionnerait - Cependant, je pense qu'il doit y avoir un moyen plus "mongo" / plus sûr de convertir l'Id.
J'ai vérifié les docs, mais cela ne mentionne que la méthode toString (), qui ne semble pas fonctionner correctement dans map: https://docs.mongodb.com/manual/reference/method/ObjectId.toString/
deviner:
obj.map = function() {
for(var i = 0; i < inputs.length; i++){
if(this._id.equals(inputs[i])) {
var order = i;
}
}
emit(order, {doc: this});
};