Documento como este

{
    "_id" : ObjectId("5db65eb2a2f3a61fe88e162a"), 
    "devicesCxt" : [
        {
            "deviceId" : "1232", 
            "userAgent" : "PostmanRuntime/7.19.0", 
            "online" : false, 
            "_id" : ObjectId("5db65eb2a2f3a61fe88e162c"), 
            "loginAt" : ISODate("2019-10-28T03:21:22.178+0000")
        }
    ], 
}

Quiero agregar esto

{
    "deviceId" : "1233", 
    "userAgent" : "PostmanRuntime/7.19.0", 
    "online" : false, 
    "_id" : ObjectId("5db65eb2a2f3a61fe88e162b"), 
    "loginAt" : ISODate("2019-10-28T03:21:22.178+0000")
}

Quiero algo como esto

{
    "_id" : ObjectId("5db65eb2a2f3a61fe88e162a"), 
    "devicesCxt" : [
        {
            "deviceId" : "1232", 
            "userAgent" : "PostmanRuntime/7.19.0", 
            "online" : false, 
            "_id" : ObjectId("5db65eb2a2f3a61fe88e162c"), 
            "loginAt" : ISODate("2019-10-28T03:21:22.178+0000")
        },
        {
            "deviceId" : "1233", 
            "userAgent" : "PostmanRuntime/7.19.0", 
            "online" : false, 
            "_id" : ObjectId("5db65eb2a2f3a61fe88e162b"), 
            "loginAt" : ISODate("2019-10-28T03:21:22.178+0000")
        }
    ],
}

Si deviceId: 1232 no lo permite, de lo contrario deviceId: 1233 puede tener éxito.

No se puede tener el mismo objeto para deviceId

deviceId debe mantenerse único en la matriz.

¿Cómo puedo hacer esto?

3
Amorous 28 oct. 2019 a las 16:14

3 respuestas

La mejor respuesta

Podría tener una consulta de actualización condicional para evitar la adición de documentos al campo devicesCxt cuando el deviceId del objeto entrante ya está presente. $push

Consulta Mongo:

const incomingDoc = {
  deviceId: "1233",
  userAgent: "PostmanRuntime/7.19.0",
  online: false,
  _id: ObjectId("5db65eb2a2f3a61fe88e162b"),
  loginAt: ISODate("2019-10-28T03:21:22.178+0000")
};

db.collection.update(
  {
    _id: idToFilterIfAny,
    "devicesCxt.deviceId": { $ne: incomingDoc.deviceId }
  },
  { $push: { devicesCxt: incomingDoc } }
);
1
ambianBeing 28 oct. 2019 a las 16:11

ACTUALIZADO

Su esquema podría ser algo como esto:

const mySchema = new Schema({
  deviceCtx: [{
      deviceId : { type: String, unique: true},
      userAgent : { type: String, },
      online : { type: Boolean, },
      loginAt : { type: Date, },
    }]
});

Para agregar un nuevo elemento en la matriz:

const mySchema = await mySchema.find({ _id: "5db65eb2a2f3a61fe88e162a" });

const newDeviceId = req.body.deviceId;
mySchema.devicesCxt.push({
  deviceId : newDeviceId,
  userAgent : "PostmanRuntime/7.19.0",
  online : false,
  loginAt : new Date()
});

await mySchema.save();
1
ambianBeing 28 oct. 2019 a las 13:50

Utilizar esta.

let deviceid = {
    "deviceId" : "1233", 
    "userAgent" : "PostmanRuntime/7.19.0", 
    "online" : false, 
    "_id" : ObjectId("5db65eb2a2f3a61fe88e162b"), 
    "loginAt" : ISODate("2019-10-28T03:21:22.178+0000")
}
myModel.update(

    { $push: { devicesCxt: deviceid } },
);

Pero si desea agregar mongo _id a su matriz, debe definirlo en su esquema

1
babak abadkheir 28 oct. 2019 a las 13:55