Dans mon application actuelle, j'ai l'appel MongoDB FindAndModify
suivant au serveur MongoDBOù FindAndModify s'intègre-t-il dans CQRS?
public static TEntity PeekForRemoveSync<TEntity>(this MongoCollection<TEntity> collection, string reason)
where TEntity : class, IEntity, IUpdatesTrackable, ISyncable, IDeletable, IApprovable
{
if (reason == null)
{
throw new ArgumentNullException(nameof(reason));
}
IMongoQuery query = Query.And(
Query<TEntity>.EQ(e => e.SyncInfo.IsDirty, true),
Query<TEntity>.NE(e => e.Deletion, null),
Query<TEntity>.NE(e => e.Approval, null),
Query<TEntity>.EQ(e => e.SyncInfo.HumanInvestigateFlag, null),
Query.Or(
Query<TEntity>.EQ(e => e.SyncInfo.IsUpdateInProgress, false),
Query<TEntity>.LT(e => e.SyncInfo.UpdateStartInfo.OccuredOn, DateTime.UtcNow.AddSeconds(-SyncConstants.PeekExpireTimeInSeconds))
),
Query<TEntity>.LTE(e => e.SyncInfo.PeekedCount, MaxPeekedCount)
);
return PeekForSync(collection, query, reason);
}
private static TEntity PeekForSync<TEntity>(this MongoCollection<TEntity> collection, IMongoQuery query, string reason)
where TEntity : class, IEntity, IUpdatesTrackable, ISyncable, IDeletable
{
UpdateBuilder<TEntity> update = Update<TEntity>
.Inc(e => e.SyncInfo.PeekedCount, 1)
.Set(e => e.SyncInfo.UpdateStartInfo, new OccuranceWithReason(reason))
.Set(e => e.SyncInfo.IsUpdateInProgress, true);
SortByBuilder<TEntity> sort = SortBy<TEntity>.Descending(e => e.LastUpdatedOn);
FindAndModifyArgs fmArgs = new FindAndModifyArgs
{
Query = query,
Update = update,
SortBy = sort,
VersionReturned = FindAndModifyDocumentVersion.Modified
};
FindAndModifyResult result = collection.FindAndModify(fmArgs);
return result.ModifiedDocument != null
? result.GetModifiedDocumentAs<TEntity>()
: null;
}
Am I reinventing yet another queue system with MongoDB? That's not my intention here but it's what it's. Just ignore the business logic there.
En CQRS, la requête et commande signifie ce qui suit (je crois):
Commande: Change l'état du système et ne renvoie aucune valeur.
Interrogation: Ne modifie pas l'état du système et ne renvoie aucune valeur.
Si tel est le cas, d'où mon appel FindAndModify
ci-dessus (ou tout autre similaire comme cette requête) correspond?
Point intéressant. Je vois que vous ne devriez pas lancer une * requête * contre votre 'cache de lecture', car cela pourrait être incohérent, mais pour reconstruire l'état, je devrais interroger * quelque chose *? Je suppose que c'est ce que vous voulez dire par "chargé par id", mais quelle autre méthode de chargement existe-t-il (ORMs, ODMs et similaire hellspawn?) Dans MongoDB, la valeur par défaut est read from the primary autorise explicitement les lectures périmées des secondaires. – mnemosyn
Désolé, ma terminologie [RavenDB] (http://ravendb.net) me gêne. Mais l'idée est toujours valable pour Mongo et autres db's. Mise à jour ma réponse –
thx! * "vous n'auriez vraiment aucun moyen de savoir si vous étiez vraiment fait ou pas" * 'FindAndModify' dans le pilote MongoDB appelle le [' db.collection.findAndModify'] (http://docs.mongodb.org/manual/ reference/method/db.collection.findAndModify /) qui est atomique. – tugberk